Delphi資料壓縮處理(1)
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事件中寫上對應的過程呼叫程式碼。
部分程式原始碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Zlib;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$ R* .DFM}
1.捕捉全螢幕影像
procedure GetScreen(var Bmp: TBitmap);
var
Dc: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
begin
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
try
MyCanvas.Handle := Dc;
MyRect:=Rect(0, 0,Screen.Width, Screen.Height);
file://影像為24位元真彩色,也可依實際需求調整
Bmp.PixelFormat := pf24bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
file://捕捉整個螢幕影像
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
finally
MyCanvas.Handle := 0;
MyCanvas.Free;
ReleaseDC(0, Dc);
end;
end;
2.壓縮影像
procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
file://取得影像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Try
file://SourceStream中保存著原始的映像流
CompressedStream.SaveToStream(SourceStream);
file://將原始影像流進行壓縮, DestStream中保存著壓縮後的影像流
SourceStream.Free;
CompressedStream.Clear;
file://寫入原始影像的尺寸
CompressedStream.WriteBuffer(Count, SizeOf
(Count));
file://寫入經過壓縮的圖片流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;
3.還原被壓縮影像
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;