![]() |
|
通过类TCompressionStream和TdecompressionStream的配合使用,我们可以非常方便地完成数据的压缩和解压,下面就是本人在编写屏幕拷贝程序中的使用例子:
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;
转贴于:计算机等级考试_考试大