May 14, 2005

[Delphi] GDI+ VCL TBitmap から GDI+ Bitmap へ

gdiplus08

前にここGDI+bitmap オブジェクトの内容を VCLTBitmap オブジェクトに転写した。今回は、その逆である VCL TBitmap から GDI+ Bitmap への転送を試した。

TGPBitmap クラスのコンストラクタのうち
constructor Create(stream:IStream;..);reintroduce;overload;
を使う。まず、VCL TBitmap オブジェクトの内容を SaveToStream() によって、TMemoryStream にセーブする。次に、TStreamAdapter クラスのインスタンスを作成して、TMemoryStream オブジェクトを IStream に変換し、上記のコンストラクタで作成する。TMemoryStream オブジェクトは TGPBitmap オブジェクトをつかっている間は Free してはいけないようだ。

これで、ファイルを介さずに GDI+ Bitmap ←→ VCL TBitmap が完全に双方向になった。このことの意義は、GDI+ の豊富な機能を使ってイメージを加工した後で、また VCL TBitmap にその結果を戻すことができることだ。関数にすると、完全に GDI+ 側を VCL から隠蔽出来る

コードは
uses
  GDIPAPI, GDIPOBJ;

procedure TForm1.Button1Click(Sender: TObject);
var
  srcbmp: TBitmap;
  stream:TMemoryStream;
  graphics : TGPGraphics;
  dstbmp: TGPBitmap;
begin
  srcbmp := TBitmap.Create;
  srcbmp.LoadFromFile('test.bmp');
  stream := TMemoryStream.Create;
  srcbmp.SaveToStream(stream);
  srcbmp.Free;

  dstbmp := TGPBitmap.Create(TStreamAdapter.Create(stream));

  graphics := TGPGraphics.Create(Canvas.Handle);
  graphics.DrawImage(dstbmp,5,5);

  dstbmp.Free;
  stream.Free;
  graphics.Free;
end;

この記事へのトラックバックURL