當前位置:外匯行情大全網 - 外匯開戶 - Delphi壓縮流和解壓縮流的應用

Delphi壓縮流和解壓縮流的應用

軟件開發人員必然會遇到壓縮數據的問題!經常使用Delphi的朋友都知道,它為我們提供了兩個stream類(TCompressionStream和TDecompressionStream)來壓縮和解壓縮數據,但美中不足的是,在Delphi的幫助下沒有對streams進行詳細的解釋,這使得它們很難使用。其實這兩個類的源代碼和庫都是Delphi系統提供的。存放在Delphi光盤的InfoExtraslib Src和InfoExtraslibObj目錄下(其中庫存放在Obj目錄下,源代碼存放在Src目錄下,有興趣的朋友可以看看)。我在使用的過程中對它們有了壹定的了解。

該類的描述

1,基類TCustomZlibStream:class TCustomZlibStream是類TCompressionStream和TDecompressionStream的基類,它主要有壹個屬性:OnProgress,這個屬性會在類的壓縮或解壓縮過程中發生。其定義如下:

Procedure OnProgress(發件人:to object);動態;

2.壓縮類tccompressionstream:tccompressionstream類除了繼承基類的OnProgress屬性外,還增加了另壹個屬性:CompressionRate,定義如下:

Property CompressionRate:單次讀取GetCompressionRate通過這個性質,可以得到壓縮比。

它的幾個重要方法定義如下:

構造函數TCompressionStream。create(compression level:TCompressionLevel;dest:TStream);

其中:TcompressionLevel(壓縮類型),由以下內容定義:

(1) clNone:無數據壓縮;

(2)cl fast:以犧牲壓縮效率為代價的快速壓縮;

③ clDefault:正常壓縮;

(4) clMax:最大化壓縮,犧牲速度;

Dest:目的流,用於存儲壓縮數據。

函數TCompressionStream。寫(const Buffercount:Longint):Longint;

其中:Buffer:要壓縮的數據;

Count:要壓縮的數據的字節數;

函數返回寫入流的字節數。

只能寫入壓縮類TCompressionStream的數據。如果您試圖從中讀取數據,將會出現“錯誤”異常。要壓縮的數據通過Write方法寫入流中,在寫入過程中進行壓縮,存儲在構造函數提供的TmemoryStream中,同時觸發OnProcess事件。

3.解壓縮類TDecompressionStream:與壓縮類TcompressionStream相反,它的數據只能被讀取。如果您試圖向其中寫入數據,將會出現“錯誤”異常。它的幾個重要方法定義如下:

構造函數create(來源:tstream);

其中:Source是保存壓縮數據的流;

函數讀取(var緩沖區;count:Longint):Longint;

數據讀取功能,緩沖區:數據存儲緩沖區;

Count:緩沖區的大小;

函數返回讀取的字節數。

在讀取數據的過程中,數據被解壓縮並觸發OnProcess事件。

二,班級的使用

通過TCompressionStream和TdecompressionStream的配合,我們可以非常方便地對數據進行壓縮和解壓縮。下面是我在編寫屏幕復制程序時使用的壹個例子:

過程TClientForm。GetScreen

定義變量

SourceDC,dest DC:HDC;

bhandle:hbit map;

位圖:TBitMap

BmpStream,dest stream:TMemoryStream;

source stream:TCompressionStream;

計數:整數;

開始

SourceDC:=CreateDC('display ','','',nil);

{獲取屏幕的DC }

DestDC:= CreateCompatibleDC(SourceDC);

{建立臨時DC}

bhandle:= CreateCompatibleBitmap(SourceDC,Screen。寬度,屏幕。身高);

{創建位圖}

SelectObject(DestDC,Bhandle);

{選擇位圖DC}

BitBlt(DestDC,0,0,Screen。寬度,屏幕。Height,SourceDC,0,0,src copy);

{復制整個屏幕}

位圖:=TBitMap。創建;

位圖。handle:= Bhandle;

{將屏幕位圖保存為位圖}

BmpStream:=TMemoryStream。創建;

位圖。SaveToStream(BMP stream);

{創建位圖數據的內存流}

計數:=BmpStream。尺寸;

{保存位圖的大小}

DestStream:=TMemoryStream。創建;

{目標流,保存壓縮數據}

source stream:= TCompressionStream。Create(clMax,dest stream);

{建立壓縮流,采用最大壓縮,並保存在目標流中}

嘗試

BmpStream。SaveToStream(源流);

{壓縮位圖流}

源流。免費;

{完成壓縮並釋放壓縮流}

BmpStream。清晰;

{清空原始位圖流}

BmpStream。WriteBuffer(計數,Sizeof(計數));

{將原始位圖大小保存到新的位圖流中以供使用}

BmpStream。CopyFrom(DestStream,0);

{將壓縮數據追加到新位圖流}

BmpStream。位置:= 0;

NMStrm。PostIt(BMP stream);

{發送位圖流}

最後

DestStream。免費;

BmpStream。破壞;

位圖。破壞;

DeleteDC(SourceDC);

ReleaseDC(Bhandle,SourceDC);

結束;

{發布相關資源}

結束;

在此過程中,獲得整個屏幕的圖像副本,並使用壓縮流SourceStream和內存流Deststream對位圖進行壓縮,位圖大小和壓縮數據流再次保存在位圖流中並發送出去。發送位圖大小的目的是在解壓縮之前確定所需的內存空間。

過程TServerForm。NMStrmServMSG(發送方:TComponent

const SF from:String;strm:TStream);

定義變量

StreamStr,dest stream:TMemoryStream;

source stream:TDecompressionStream;

計數:整數;

緩沖區:指針;

開始

屏幕圖像。圖片.位圖:= nil

如果Strm是TMemoryStream,那麽

StreamStr := Strm AS TMemoryStream

其他

退出;

StreamStr。位置:= 0;

StreamStr。ReadBuffer(Count,Sizeof(Count));

{獲取位圖的大小}

GetMem(緩沖區,計數);

{申請數據空間}

DestStream := TMemoryStream。創建;

source stream:= TDecompressionStream。create(StreamStr);

{構建壹個解壓縮流,壓縮後的數據從StreamStr流中獲取}

狀態欄。SimpleText := '正在處理圖像';

嘗試

源流。readbuffer(buffer^,count);

{讀出解壓縮的數據}

DestStream。writebuffer(buffer^,count);

{保存在位圖流中}

DestStream。位置:= 0;

屏幕圖像。picture . bitmap . loadfromstream(dest stream);

{顯示在屏幕上}

最後

FreeMem(緩沖區);

DestStream。破壞;

源流。破壞;

結束;

結束;

在這個過程中,從獲取的數據流中獲取位圖大小,並應用內存空間,然後建立解壓縮流,並將解壓縮後的數據保存在位圖流中,然後顯示在屏幕上。

該程序在Delphi6.0中調試成功。

  • 上一篇:全民炒股有什麽好處和壞處?
  • 下一篇:如何查詢外資企業的中文名稱
  • copyright 2024外匯行情大全網