Borland公司推出的RAD開發工具Delphi 5.0作為Windows平台上的主流開發工具,其視覺化的開發環境和物件導向程式設計的強大功能已經吸引了無數的開發人員。但是,有些程式設計師在實際的開發過程中卻時常為對大量的資料進行壓縮而傷透腦筋,不得不去尋找一些高效的壓縮演算法或在網路上尋找第三方的控制項來實現壓縮。難道Delphi本身沒有提供這個功能嗎?其實Delphi的程式設計師早就考慮到了這一點,他們提供了Zlib.pas和Zlibconst.pas兩個單元檔案來解決資料壓縮問題,實現了很高的資料壓縮比率。這兩個檔案保存在Delphi 5.0安裝光碟上InfoExtras lib目錄下,此外,在InfoExtras libObj目錄中也保存了Zlib.pas單元所引用的Obj檔案。以下本文以壓縮一個螢幕拷貝為例介紹如何使用這項功能。
| 首先利用螢幕拷貝捕捉到目前整個螢幕的影像,然後在記憶體中儲存為BMP檔案格式。壓縮時,使用TComPRessionStream物件對原始影像進行壓縮並且儲存為自訂的檔案格式;解壓縮時,使用TDecompressionStream物件對被壓縮的影像進行解壓縮,還原為BMP格式的影像檔案。 |
| 新建一個專案文件,在主機的介面部分引用Zlib.pas,在主表單上放置兩個按鈕Button1、 Button2,在它們的OnClick事件中寫上對應的過程呼叫程式碼。 |
| Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Zlib; |
| procedure Button1Click(Sender: TObject); |
| procedure Button2Click(Sender: TObject); |
| procedure GetScreen(var Bmp: TBitmap); |
| MyCanvas := TCanvas.Create; |
| MyRect:=Rect(0, 0,Screen.Width, Screen.Height); |
| Bmp.PixelFormat := pf24bit; |
| Bmp.Width := MyRect.Right; |
| Bmp.Height := MyRect.Bottom; |
| Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); |
| procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
| SourceStream: TCompressionStream; |
| DestStream: TMemoryStream; |
| Count := CompressedStream.Size; |
| DestStream := TMemoryStream.Create; |
| SourceStream:=TCompressionStream.Create |
| (CompressionLevel, DestStream); |
| CompressedStream.SaveToStream(SourceStream); |
| //將原始影像流進行壓縮, DestStream中保存著壓縮後的映像流 |
| CompressedStream.WriteBuffer(Count, SizeOf |
| CompressedStream.CopyFrom(DestStream, 0); |
| procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
| SourceStream: TDecompressionStream; |
| DestStream: TMemoryStream; |
| CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
| //根據影像尺寸大小為將要讀入的原始影像流分配記憶體區塊 |
| DestStream := TMemoryStream.Create; |
| SourceStream := TDecompressionStream.Create(CompressedStream); |
| //將被壓縮的圖像流解壓縮,然後存入Buffer內存塊中 |
| SourceStream.ReadBuffer(Buffer^, Count); |
| DestStream.WriteBuffer(Buffer^, Count); |
| DestStream.Position := 0;//重設流指針 |
| Bmp.LoadFromStream(DestStream); |
| procedure TForm1.Button1Click(Sender: TObject); |
| CompressedStream: TMemoryStream; |
| CompressedStream := TMemoryStream.Create; |
| //擷取目前整個畫面,將影像儲存至Bmp物件中GetScreen(Bmp); |
| Bmp.SaveToStream(CompressedStream); |
| CompressBitmap(CompressedStream, clDefault); |
| CompressedStream.SaveToFile(' C:cj.dat' ); |
| procedure TForm1.Button2Click(Sender: TObject); |
| CompressedStream: TFileStream; |
| CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
| UnCompressBitmap(CompressedStream, Bmp); |
| Bmp.SaveToFile(' C:cj.bmp' ); |
| 此外TCompressionStream物件也提供了CompressionRate屬性,該屬性用於描述對原始資料進行壓縮後的壓縮比率,而OnProgress事件在壓縮與解壓縮過程中都會被觸發,開發人員可以在該事件中編寫用於顯示進度的代碼。 |