http://mrxray.on.coocan.jp/Delphi/ResizeSamples/R230_GDIPlus_PenColorBrush.htm
のページ以降に,GDI+ のサンプルを掲載していますが (JUNKI さんのサイトのリンクもあります),
ほとんどのサンプルが,画像ファイルを読み込んで直接描画する方式となっています.
これを,各画像形式のオブジェクトのインスタンスから GDI+ のオブジェクトに変換する
方法です.
動作確認は,Windows U64(SP1) + Delphi XE Pro です.
JPEG, GIF, PNG 等は,例えば以下のようにできます.
var FGDPImage : TGPBitmap; FDispStream : TMemoryStream;
//============================================================================= // フォーム生成時の処理 //============================================================================= procedure TForm1.FormCreate(Sender: TObject); begin FGDPImage := nil; FDispStream := TMemoryStream.Create; end;
//============================================================================= // 狩猟時の処理 //============================================================================= procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FGDPImage) then FreeAndNil(FGDPImage); if Assigned(FDispStream) then FreeAndNil(FDispStream); end;
//============================================================================= // JPEG, GIF, PNG ファイル画像を読み込んで TGDPBitmapに変換 // // ファイルから直接TGPbitmap(TGPImageも同じ)を生成した場合,そのファイルが削除 // されると,画像の表示はできなくなる // それと同じで,画像を格納したメモリストリームを削除すると画像は表示できない //============================================================================= procedure TForm1.Button1Click(Sender: TObject); var AJpgImg : TJPEGImage; begin if FGDPImage <> nil then FreeAndNil(FGDPImage);
FDispStream.Clear; AJpgImg := TJPEGImage.Create; try AJpgImg.LoadFromFile('503.jpg'); AJpgImg.SaveToStream(FDispStream);
//メモリストリームからTGPBitampを生成 //TStreamAdapterを介して行う.TMemoryStreamから直接読み込めないので注意 FGDPImage := TGPBitmap.Create(TStreamAdapter.Create(FDispStream, soReference)); finally FreeAndNil(AJpgImg); end; Invalidate; end;
//============================================================================= // OnPaintイベント処理 // TGPGraphicを生成して画像を表示 //============================================================================= procedure TForm1.FormPaint(Sender: TObject); var GDPGraphic : TGPGraphics; begin GDPGraphic := TGPGraphics.Create(Canvas.Handle); GDPGraphic.DrawImage(FGDPImage, 10.0, 40.0, 120, 120); GDPGraphic.Free; end;
end.
メタファイル画像の場合は以下のように,メモリストリームに直接読み込むやり方でできます.
JPEG 等もこの方法で GDI+ のオブジェクトに変換できます.
メタファイルの場合は,TGPMetaFile というクラスがあります.
これを利用した方がいいかも知れません,メタファイルへの描画は,TMetaFile より便利です.
var FGDPImage : TGPBitmap; FDispStream : TMemoryStream;
//============================================================================= // フォーム生成時の処理 //============================================================================= procedure TForm1.FormCreate(Sender: TObject); begin FGDPImage := nil; FDispStream := TMemoryStream.Create; end;
//============================================================================= // 終了時の処理 //============================================================================= procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FGDPImage) then FreeAndNil(FGDPImage); if Assigned(FDispStream) then FreeAndNil(FDispStream); end;
//============================================================================= // メタファイル画像を読み込んで TGDPBitmapに変換 // JPEG, GIF, PNG もこの方法が使える // メタファイルの場合,メタファイルを参照すると,内容が消失してしまうので,メ // モリストリームに直接読み込む方法が確実 //============================================================================= procedure TForm1.Button2Click(Sender: TObject); begin if FGDPImage <> nil then FreeAndNil(FGDPImage);
FDispStream.Clear; FDispStream.LoadFromFile('006.wmf');
//メモリストリームからTGPBitampを生成 //TStreamAdapterを介して行う.TMemoryStreamから直接読み込めないので注意 FGDPImage := TGPBitmap.Create(TStreamAdapter.Create(FDispStream, soReference)); Invalidate; end;
//============================================================================= // OnPaintイベント処理 // TGPGraphicを生成して画像を表示 //============================================================================= procedure TForm1.FormPaint(Sender: TObject); var GDPGraphic : TGPGraphics; begin GDPGraphic := TGPGraphics.Create(Canvas.Handle); GDPGraphic.DrawImage(FGDPImage, 10.0, 40.0, 120, 120); GDPGraphic.Free; end;
end.
|