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

关于 Delphi 中压缩流和解压流的应用,第1张

软件开发者不免都要遇到压缩数据的问题!经常使用Delphi的朋友都知道 它为我们提供了两个流类(TCompressionStream和TDepressionStream)来完成数据的压缩和解压缩 但美中不足的是 该流在Delphi 的帮助中没有详细的说明 使得它们在使用起来有一定得困难 其实在Delphi系统中提供了这两个类的源代码和库 保存在Delphi 光盘的\Info\Extras\Zlib\ Src和\Info\Extras\Zlib\Obj目录中(其中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: TCompressionLevelDest: TStream) 其中 TpressionLevel(压缩类型) 它由如下几个定义

① clNone 不进行数据压缩

② clFastest 进行快速压缩 牺牲压缩效率

③ clDefault 进行正常压缩

④ clMax 进行最大化压缩 牺牲速度

Dest 目的流 用于存放压缩过的数据

Function TCompressionStream Write (const BufferCount: Longint): Longint 其中 Buffer 需要压缩的数据

Count: 需要压缩的数据的字节数

函数返回写入流的字节数

压缩类TCompressionStream的数据只能是写入的 如果试图从其内部读取数据 将发生一个 Error 异常 需要压缩的数据通过方法 Write写入流中 在写入的过程中就被压缩 并保存在由构造函数提供的内存流(TmemoryStream)中 同时触发 OnProcess 事件

解压缩类 TDepressionStream :和压缩类TpressionStream 相反 它的数据是只能读出的 如果试图往其内部写数据 将发生一个 Error 异常 它的几个重要方法定义如下

构造函数 Constructor Create(Source: TStream)

其中 Source 是保存著压缩数据的流

Function Read(var BufferCount: Longint): Longint 数据读出函数 Buffer 存数据缓冲区

Count: 缓冲区的大小

函数返回读出的字节数

数据在读出的过程中 数据被解压缩 并触发 OnProcess 事件

二 类的使用

通过类TCompressionStream和TdepressionStream的配合使用 我们可以非常方便地完成数据的压缩和解压 下面就是本人在编写屏幕拷贝程序中的使用例子

Procedure TClientForm GetScreenVarSourceDC DestDC:HDCBhandle:HBITMAPBitMap:TBitMapBmpStream Deststream:TMemoryStreamSourceStream:TCompressionStreamCount:IntegerBeginSourceDC:=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 CreateBitMap Handle := Bhandle{保存屏幕位图到 BitMap中}BmpStream:=TMemoryStream CreateBitMap 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/24929

1.首先查看一下是否下载了解压软件,没有安装解压软件是打不开压缩文件的,解压软件有很多种,例如winrar等,自己选择,各种解压软件都差不多。

2.如果安装了解压软件还是打不开,可能后缀名是没有关联上软件,或者被其他软件关联了,例如winrar关联后压缩文件是下面左边的这种图标,如果不小心被一些其他软件关联,就会显示不同的图标。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11486080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存