如何解压文件压缩包 Delphi 中压缩流和解压流的应用
Delphi 中压缩流和解压流的应用
软件开发者不免都要遇到压缩数据的问题!经常使用Delphi的朋友都知道 它为我们提供了两个流类(TCompressionStream和TDepressionStream)来完成数据的压缩和解压缩 但美中不足的是 该流在Delphi 的帮助中没有详细的说明 使得它们在使用起来有一定得困难 其实在Delphi系统中提供了这两个类的源代码和库 保存在Delphi 光盘的InfoExtrasZlib Src和InfoExtrasZlibObj目录中(其中OBJ录中保存的是库 Src目录中保存的是源代码 感兴趣的朋友可以看看) 本人在使用的过程中 对它们有了一定的了解一 类的说明
基类 TCustomZlibStream 类TCustomZlibStream 是类TCompressionStream和TDepressionStream 类的基类 它主要有一个属性 OnProgress 在类进行压缩或解压缩的过程中会发生这个的事件 它的定义如下
Procedure OnProgress (Sender: TObject); dynamic;
压缩类TCompressionStream 类TCompressionStream除了继承了基类的 OnProgress 属性外 又增加了一个属性 CompressionRate 它的定义如下
Property CompressionRate: Single read GetCompressionRate;通过这个属性 可以得到压缩比
它的几个重要的方法定义如下
Constructor TCompressionStream Create (CompressionLevel: TCompressionLevel; Dest: TStream);

其中 TpressionLevel(压缩类型) 它由如下几个定义
① clNone 不进行数据压缩
② clFastest 进行快速压缩 牺牲压缩效率
③ clDefault 进行正常压缩
④ clMax 进行最大化压缩 牺牲速度
Dest 目的流 用于存放压缩过的数据
Function TCompressionStream Write (const Buffer; Count: Longint): Longint;
其中 Buffer 需要压缩的数据
Count: 需要压缩的数据的字节数
函数返回写入流的字节数
压缩类TCompressionStream的数据只能是写入的 如果试图从其内部读取数据 将发生一个 Error 异常 需要压缩的数据通过方法 Write写入流中 在写入的过程中就被压缩 并保存在由构造函数提供的内存流(TmemoryStream)中 同时触发 OnProcess 事件
解压缩类 TDepressionStream :和压缩类TpressionStream 相反 它的数据是只能读出的 如果试图往其内部写数据 将发生一个 Error 异常 它的几个重要方法定义如下
构造函数 Constructor Create(Source: TStream);
其中 Source 是保存著压缩数据的流
Function Read(var Buffer; Count: Longint): Longint;
数据读出函数 Buffer 存数据缓冲区
Count: 缓冲区的大小
函数返回读出的字节数
数据在读出的过程中 数据被解压缩 并触发 OnProcess 事件
二 类的使用
通过类TCompressionStream和TdepressionStream的配合使用 我们可以非常方便地完成数据的压缩和解压 下面就是本人在编写屏幕拷贝程序中的使用例子
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 Screen Width Screen Height SourceDC 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 ); {将压缩数据附加到新的位图流后面} BmpStream Position := ; NMStrm PostIt(BmpStream); {发送位图流} finally DestStream Free; BmpStream Destroy ; BitMap Destroy; DeleteDC(SourceDC); ReleaseDC(Bhandle SourceDC); end; {释放有关资源} End;
该过程得到整个屏幕的图象拷贝 并利用压缩流SourceStream和内存流 Deststream将位图压缩 并重新把位图大小和压缩数据流保存到位图流中 发送出去 发送位图大小的目的是在解压前来确定需要的内存空间
lishixinzhi/Article/program/Delphi/201311/24717