ボーランド社が発売した 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イベントに対応するプロシージャ呼び出しコードを記述します。 |
| ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、StdCtrls、Zlib。 |
| プロシージャ Button1Click(送信者: TObject); |
| プロシージャ Button2Click(送信者: TObject); |
| プロシージャ GetScreen(var Bmp: TBitmap); |
| MyCanvas := TCanvas.Create; |
| MyRect:=Rect(0, 0,Screen.Width, Screen.Height); |
| //画像は 24 ビットのトゥルー カラーで、実際のニーズに応じて調整することもできます。 |
| Bmp.PixelFormat := pf24bit; |
| Bmp.Width := MyRect.Right; |
| Bmp.Height := MyRect.Bottom; |
| Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); |
| プロシージャ CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
| ソースストリーム: TCompressionStream; |
| DestStream: TMemoryStream; |
| カウント := CompressedStream.Size; |
| DestStream := TMemoryStream.Create; |
| SourceStream:=TCompressionStream.Create |
| //SourceStream は元の画像ストリームを保存します |
| CompressedStream.SaveToStream(SourceStream); |
| //元の画像ストリームを圧縮し、圧縮された画像ストリームは DestStream に保存されます。 |
| CompressedStream.WriteBuffer(Count, SizeOf) |
| CompressedStream.CopyFrom(DestStream, 0); |
| プロシージャ UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
| ソースストリーム: TDecompressionStream; |
| DestStream: TMemoryStream; |
| //圧縮画像ストリームから元の画像のサイズを読み取ります |
| CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
| //画像サイズに基づいて、元の画像ストリームを読み取るためのメモリ ブロックを割り当てます。 |
| DestStream := TMemoryStream.Create; |
| SourceStream := TDecompressionStream.Create(CompressedStream); |
| //圧縮された画像ストリームを解凍し、バッファ メモリ ブロックに保存します |
| SourceStream.ReadBuffer(Buffer^, Count); |
| //元の画像ストリームを DestStream ストリームに保存します |
| DestStream.WriteBuffer(Buffer^, Count); |
| DestStream.Position := 0;//ストリームポインタをリセット |
| //DestStream ストリームから元の画像ストリームを読み込みます |
| Bmp.LoadFromStream(DestStream); |
| プロシージャ TForm1.Button1Click(送信者: TObject); |
| CompressedStream := TMemoryStream.Create; |
| // 現在の画面全体をキャプチャし、画像を Bmp オブジェクトに保存します GetScreen(Bmp); |
| //Bmp オブジェクト内の画像をメモリ ストリームに保存します |
| Bmp.SaveToStream(CompressedStream); |
| // デフォルトの圧縮率に従って元の画像ストリームを圧縮します |
| CompressBitmap(CompressedStream, clDefault); |
| //圧縮された画像ストリームをカスタム形式のファイルに保存します |
| CompressedStream.SaveToFile(' C:cj.dat' ); |
| プロシージャ TForm1.Button2Click(送信者: TObject); |
| //カスタム圧縮形式ファイルをファイル ストリームの読み取り専用モードで開きます |
| CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
| UnCompressBitmap(CompressedStream, Bmp); |
| //元の画像ストリームを指定された BMP ファイルに復元します |
| Bmp.SaveToFile(' C:cj.bmp' ); |
| さらに、TCompressionStream オブジェクトには、元のデータの圧縮後の圧縮率を記述するために使用される CompressionRate プロパティも用意されており、開発者はこのイベントに進行状況を表示するコードを書き込むことができます。 。 |
| 上記のコードはデバッグに合格し、Delphi 5.0 で実行されます。 |