知识大全 Delphi 中压缩流和解压流的应用
Posted 知
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi 中压缩流和解压流的应用相关的知识,希望对你有一定的参考价值。
Delphi 中压缩流和解压流的应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
软件开发者不免都要遇到压缩数据的问题!经常使用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: 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将位图压缩 并重新把位图大小和压缩数据流保存到位图流中 发送出去 发送位图大小的目的是在解压前来确定需要的内存空间
cha138/Article/program/Delphi/201311/24717相关参考
应用程序文件解压后自动消失考虑是系统文件问题或者是驱动问题如果是这两样就需要排查首先卸载驱动然后重装(可以利用第三方软件)不行就需要系统重装还不行只能轻装业人员来修修考虑是驱动问题或者是你的电脑硬件问
DELPHI基础教程:Delphi应用程序的应用(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(二)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(二)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(二)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
DELPHI基础教程:Delphi应用程序的应用(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
Delphi字符串列表及应用(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Delphi应