扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:冯志强 来源:yesky 2007年11月1日
关键字:
Procedure TClientForm.GetScreen; Var SourceDC,DestDC:HDC; Bhandle:HBITMAP; BitMap:TBitMap; BmpStream,Deststream:TMemoryStream; SourceStream:TCompressionStream; Count:Integer; Begin SourceDC:=CreateDC('display','','',nil); {得到屏幕的 DC} DestDC:=CreateCompatibleDC(SourceDC); {建立临时 DC} Bhandle:=CreateCompatibleBitmap(SourceDC,Screen.Width, Screen.Height); {建立位图} SelectObject(DestDC,Bhandle); {选择位图DC} BitBlt(DestDC,0,0,Screen.Width, Screen.Height,SourceDC,0,0,SRCCOPY); {拷贝整个屏幕} BitMap:=TBitMap.Create; BitMap.Handle := Bhandle; {保存屏幕位图到 BitMap中} BmpStream:=TMemoryStream.Create; BitMap.SaveToStream(BmpStream); {建立位图数据的内存流} count:=BmpStream.Size; {保存位图的大小} DestStream:=TMemoryStream.Create; {目标流,保存压缩数据} SourceStream:=TCompressionStream.Create(clMax, DestStream); {构建压缩流,采用最大化压缩,并保存到目标流中} try BmpStream.SaveToStream(SourceStream); {压缩位图流} SourceStream.Free; {完成压缩,释放压缩流} BmpStream.Clear; {清空原来位图流} BmpStream.WriteBuffer(Count, Sizeof(Count)); {将原来位图的大小保存到新的位图流中,以便使用} BmpStream.CopyFrom(DestStream, 0); {将压缩数据附加到新的位图流后面} BmpStream.Position := 0; NMStrm.PostIt(BmpStream); {发送位图流} finally DestStream.Free; BmpStream.Destroy ; BitMap.Destroy; DeleteDC(SourceDC); ReleaseDC(Bhandle,SourceDC); end; {释放有关资源} End; |
该过程得到整个屏幕的图象拷贝,并利用压缩流SourceStream和内存流 Deststream将位图压缩,并重新把位图大小和压缩数据流保存到位图流中,发送出去,发送位图大小的目的是在解压前来确定需要的内存空间。
procedure TServerForm.NMStrmServMSG(Sender: TComponent; const sFrom: String; strm: TStream); Var StreamStr,DestStream:TMemoryStream; SourceStream:TDecompressionStream; count:Integer; buffer:pointer; begin ScreenImage.Picture.Bitmap:=nil; If Strm Is TMemoryStream Then StreamStr := Strm AS TMemoryStream Else Exit; StreamStr.Position := 0; StreamStr.ReadBuffer(Count, Sizeof(Count)); {得到位图的大小} GetMem(Buffer,Count); {申请数据空间} DestStream := TMemoryStream.Create; SourceStream := TDecompressionStream.Create(StreamStr); {构建解压流,压缩数据由StreamStr 流得到} StatusBar.SimpleText := '正在处理图象'; Try SourceStream.ReadBuffer(Buffer^,Count); {读出解压数据} DestStream.WriteBuffer(Buffer^,Count); {保存到位图流中} DestStream.Position := 0; ScreenImage.Picture.Bitmap.LoadFromStream(DestStream); {显示到屏幕上} Finally FreeMem(Buffer); DestStream.Destroy; SourceStream.Destroy; End; end; |
该过程首先从得到的数据流中取得位图大小,并申请内存空间,然后建立解压流,并将解压数据保存到位图流中,然后显示到屏幕上。
本文程序在Delphi6.0中调试通过
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者