您现在的位置是:首页 >

如何解压文件压缩包 Delphi 中压缩流和解压流的应用

火烧 2021-06-10 13:46:20 1070
Del hi 中压缩流和解压流的应用 软件开发者不免都要遇到压缩数据的问题!经常使用Del hi的朋友都知道 它为我们提供了两个流类(TCom re io Stream和TDe re io Strea

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);

如何解压文件压缩包 Delphi 中压缩流和解压流的应用

    其中 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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码