监控屏幕图像的技术实现

监控端 procedure TfrmClientScreen.Timer1Timer(Sender: TObject);var  ItemData: PClientInfoData;  idStream: TIdStreamVCL;  ms: TMemoryStream;  jpg: TJpegImage;begin  // 定时请求数据 (30秒)  // 请求更新图像  if frmMain.RzListView1.Selected = nil then      Exit  else begin      ItemData := frmMain.RzListView1.Selected.Data;      if not ItemData.bConnected then        Exit;  end;   if bToTrans then  begin      bToTrans := false;      try          if idTCPClient1.Connected then idTCPClient1.Disconnect;          idTCPClient1.Connect;          if idTCPClient1.Connected then          begin              idTCPClient1.Socket.WriteLn(SF_CLIENT_IMAGE_REQ);              // 后面应该读取数据              ms := TMemoryStream.Create;              idStream := TIdStreamVCL.Create(ms);              with IdTCPClient1 do while Connected do                  IdTCPClient1.Socket.ReadStream(idStream, -1, true);               if frmClientScreen <> nil then              begin                  Jpg := TJpegImage.Create;                  ms.Seek(0,soFromBeginning);                  Jpg.LoadFromStream(ms);                  case ImageIndex of                  0:                      begin                        Image1.Picture.Bitmap.Assign(Jpg);                        Panel1.Color := clFuchsia;                        Panel2.Color := clBtnFace;                        Panel3.Color := clBtnFace;                        Panel4.Color := clBtnFace;                      end;                  1:                      begin                        Image2.Picture.Bitmap.Assign(Jpg);                        Panel1.Color := clBtnFace;                        Panel2.Color := clFuchsia;                        Panel3.Color := clBtnFace;                        Panel4.Color := clBtnFace;                      end;                  2:                      begin                        Image3.Picture.Bitmap.Assign(Jpg);                        Panel1.Color := clBtnFace;                        Panel2.Color := clBtnFace;                        Panel3.Color := clFuchsia;                        Panel4.Color := clBtnFace;                      end;                  3:                      begin                        Image4.Picture.Bitmap.Assign(Jpg);                        Panel1.Color := clBtnFace;                        Panel2.Color := clBtnFace;                        Panel3.Color := clBtnFace;                        Panel4.Color := clFuchsia;                      end;                  end;                  ImageIndex := (ImageIndex + 1) mod 4;                  FreeAndNil(Jpg);              end;              FreeAndNil(ms);              FreeAndNil(idStream);          end;           if idTCPClient1.Connected then idTCPClient1.Disconnect;      except      on E: Exception do          begin           end;      end;      bToTrans := true;  end;end;     被控端: procedure TFormLogin.IdTCPServer1Execute(AContext: TIdContext);var  ScreenBitmap: TBitmap;  ScreenCanvas: TCanvas;  dc: HDC;  jpg: TJPEGImage;  MemoStream: TMemoryStream;  s, sCommand, sAction: String;  ms: TMemoryStream;  idStream: TIdStreamVCL;begin  //g_CriticalSection.Enter;   try      sCommand := AContext.Connection.IOHandler.ReadLn;      if sCommand = SF_CLIENT_IMAGE_REQ then      begin          // 生成Stream          ScreenBitmap := TBitmap.Create;           // 创建一个BITMAP来存放图像          ScreenBitmap.Width := screen.Width;          ScreenBitmap.Height := screen.Height;           dc := GetDC(0); //获得屏幕DC          ScreenCanvas := TCanvas.Create;          ScreenCanvas.Handle := dc;          // copy complete image into bitmap          ScreenBitmap.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), ScreenCanvas, Rect(0, 0, Screen.Width, Screen.Height));;          Jpg := TJPEGImage.Create;          Jpg.Assign(ScreenBitmap);          ScreenCanvas.Free;          //ScreenBitmap.Canvas.Free;          ReleaseDC(0, DC);          //----------------------------          ms := TMemoryStream.Create;          Jpg.SaveToStream(ms);          ms.Seek(0, soFromBeginning);           idStream := TIdStreamVCL.Create(ms);          // 写Stream          AContext.Connection.IOHandler.Write(idStream);//, 0, true);          //----------------------------          FreeAndNil(IdStream);          FreeAndNil(ms);          FreeAndNil(Jpg);          FreeAndNil(ScreenBitmap);          AContext.Connection.Disconnect;//.IOHandler.Close;      end;  except  on E: Exception do      ShowMessage(E.Message);  end;   //g_CriticalSection.Leave;end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值