Delphi データ圧縮処理(1)
ボーランド社が発売した RAD 開発ツール Delphi 5.0 は、Windows プラットフォーム上の主流の開発ツールであり、そのビジュアルな開発環境と強力なオブジェクト指向プログラミング機能により、数多くの開発者が魅了されています。ただし、一部のプログラマーは、実際の開発プロセス中に大量のデータの圧縮に苦労することが多く、圧縮を実現するには、効率的な圧縮アルゴリズムを見つけるか、インターネット上でサードパーティのコントロールを検索する必要があります。 Delphi自体がこの機能を提供していないのでしょうか?実際、Delphi プログラマーは、データ圧縮の問題を解決し、高いデータ圧縮率を達成するために、Zlib.pas と Zlibconst.pas という 2 つのユニット ファイルを提供しています。これら 2 つのファイルは、Delphi 5.0 インストール CD の InfoExtras lib ディレクトリに保存されます。さらに、Zlib.pas ユニットによって参照される Obj ファイルも InfoExtras libObj ディレクトリに保存されます。次の記事では、画面コピーの圧縮を例に、この機能の使用方法を紹介します。
ソリューションのアイデア
まず、画面コピーを使用して画面全体の現在の画像をキャプチャし、BMP ファイル形式としてメモリに保存します。圧縮する場合は、TComPRessionStream オブジェクトを使用して元のイメージを圧縮し、カスタム ファイル形式で保存します。解凍する場合は、TDecompressionStream オブジェクトを使用して圧縮されたイメージを解凍し、BMP 形式のイメージ ファイルに復元します。
具体的な実装
新しいプロジェクトファイルを作成し、本体のインターフェース部分でZlib.pasを参照し、メインフォームにButton1とButton2の2つのボタンを配置し、そのOnClickイベントに対応するプロシージャ呼び出しコードを記述します。
プログラムのソースコードの一部は次のとおりです。
ユニットユニット1;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、StdCtrls、Zlib。
タイプ
TForm1 = クラス(TForm)
ボタン 1: T ボタン;
ボタン 2: T ボタン;
プロシージャ Button1Click(送信者: TObject);
プロシージャ Button2Click(送信者: TObject);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
フォーム1: TForm1;
実装
{$ R* .DFM}
1.全画面画像をキャプチャする
プロシージャ GetScreen(var Bmp: TBitmap);
変数
DC: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
始める
DC := GetWindowDC(0);
MyCanvas := TCanvas.Create;
試す
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);
ついに
MyCanvas.ハンドル := 0;
MyCanvas.無料;
ReleaseDC(0, DC);
終わり;
終わり;
2.画像を圧縮する
プロシージャ CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
変数
ソースストリーム: TCompressionStream;
DestStream: TMemoryStream;
カウント: 整数。
始める
file://画像ストリームの元のサイズを取得します
カウント := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(圧縮レベル、DestStream);
試す
元の画像ストリームは file://SourceStream に保存されます
CompressedStream.SaveToStream(SourceStream);
file:// 元の画像ストリームを圧縮し、圧縮された画像ストリームは DestStream に保存されます。
SourceStream.Free;
CompressedStream.Clear;
file:// 元の画像の寸法を書き込みます
CompressedStream.WriteBuffer(Count, SizeOf)
(カウント));
file://圧縮画像ストリームを書き込む
CompressedStream.CopyFrom(DestStream, 0);
ついに
DestStream.Free;
終わり;
終わり;
3.圧縮されたイメージを復元する
プロシージャ UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
変数
ソースストリーム: TDecompressionStream;
DestStream: TMemoryStream;