Delphi資料壓縮處理(1) (轉)

worldblog發表於2007-12-09
Delphi資料壓縮處理(1) (轉)[@more@]

 

資料處理(1) 

 Borland公司推出的 RAD開發工具 Delphi 5.0作為 平臺上的主流開發工具,其視覺化的開發環境和麵向的強大功能已經吸引了無數的開發人員。但是,一些員在實際的開發過程中卻時常為對大量的資料進行壓縮而傷透腦筋,不得不去查詢一些高效的壓縮演算法或在網上查詢第三方的來實現壓縮。難道 Delphi本身沒有提供這個功能嗎?其實 Delphi的師早就考慮到了這一點,他們提供了 .pas和 Zlibconst.pas兩個單元來解決資料壓縮問題,實現了很高的資料壓縮比率。這兩個檔案儲存在 Delphi 5.0光碟上 InfoExtrasZlib目錄下,此外,在 InfoExtrasZlibObj目錄中還儲存了 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: T);

    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

     Stream: 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;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990234/,如需轉載,請註明出處,否則將追究法律責任。

相關文章