フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: [GDI+] TJPEGImage などのインスタンスを TGPImage 等に変換
Mr.XRAY
メンバー
投稿数: 192
[GDI+] TJPEGImage などのインスタンスを TGPImage 等に変換
on: 2013/05/12 05:50 Sun

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.
Mr.XRAY
メンバー
投稿数: 192
Re: [GDI+] TJPEGImage などのインスタンスを TGPImage 等に変換
on: 2013/05/12 05:59 Sun

>メタファイルの場合,メタファイルを参照すると,内容が消失してしまうので

このあたりの詳しい内容は,中村の里に記事があります.
読むのが面倒な人は,そのまま素直に受け入れてください (笑)
http://tknakamuri.web.fc2.com/index.htm

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.037 sec.