科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Delphi中压缩流和解压流的应用

Delphi中压缩流和解压流的应用

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Delphi为我们提供了两个流类来完成数据的压缩和解压缩 。

作者:冯志强 来源:yesky 2007年11月1日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、 类的使用

  通过类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;

  该过程得到整个屏幕的图象拷贝,并利用压缩流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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章