該類的描述
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中調試成功。