私はこのような単純なおそらく「ダム」の変換を考え推測:
type
TGraphicTypeEnum = (gteBMP, gteJPG, gteTIF, gtePNG);
procedure SaveGraphicAs(AGraphic : TGraphic; AGraphicType : TGraphicTypeEnum; AFileName : String);
var vGraphicClass : TGraphicClass;
vTargetGraphic : TGraphic;
vBmp : TBitmap;
begin
case AGraphicType of
gteBMP : vGraphicClass := TBitmap;
gtejpg : vGraphicClass := TJPEGImage;
gtetif : vGraphicClass := TWICImage;
gtepng : vGraphicClass := TPngImage;
else
// EXIT; or raise...
end;
if aGraphic is vGraphicClass then //As suggested by Rob Kennedy
AGraphic.SaveToFile(AFileName)
else
begin
vBmp := nil;
vTargetGraphic := vGraphicClass.Create;
try
vBmp := TBitmap.Create;
vBmp.Assign(AGraphic);
vTargetGraphic.Assign(vBmp);
vTargetGraphic.SaveToFile(aFileName);
finally
vTargetGraphic.Free;
vBmp.Free;
end;
end;
end;
あなたがのTPictureに割り当てるときのように、機能しなかったのTPictureに割り当て、のTPictureはクラスにグラフィックを変換しますあなたはから割り当てています。
私の例では、元のイメージが最終形式に変換される前にビットマップに変換されるので、2つの変換レイヤーがあります。プロセスにはかなりの情報が失われる可能性があります。たいていの(すべて?)グラフィックタイプはTBitmapとの変換方法を知っていますが、TJPEGImageはTPngImageへの変換方法がわからず、その逆もありません。
ファイル形式に固有の透明性やその他の効果を維持する、より効率的な変換方法を開発できますが、それは私の知る限りです。しかし、あなたのニーズに応じて、それは十分かもしれません。
BMP、PNG、GIF、JPGなどを保存するためのルーチンを作るのは非常に簡単ですが、WMFやEMFも含めるのであれば、ベクタイメージ*フォーマットであり、前者はラスタイメージ*フォーマットです。 EMF/WMFに埋め込まれたラスタービットマップとして保存することを選択しない限り、もちろんEMF/WMFフォーマットを使用するのは簡単ではありません。 –
特殊ケースwmf/emf OKだろう。あなたが言いたい統一ルーチンへのポインタを私に与えることができますか? –
PS:私はメタファイルに描画し、それを 'TPicture'に' Assign 'することは、記録されたGDI呼び出しの集合のようなものであるように思えるでしょう。 –