监控端 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;
监控屏幕图像的技术实现
最新推荐文章于 2019-09-22 18:27:25 发布