2011-09-07 9 views
6

私はTCanvas上の指定された矩形に何かを描画するルーチンprocedure DrawStuff(ACanvas: TCanvas; const ARect: TRect)を持っています。現時点では、PaintBoxのキャンバスでDrawStuffと呼んでいます。今度はSave asオプションを追加しています。ユーザーはDrawStuffの結果を保存するために、さまざまなファイル形式(bmp、wmf、jpg、... - できるだけ多くのTGraphic子孫を選択可能)から選択する必要があります。画像をさまざまなファイル形式に保存する

TMetafileに描画し、 "bla.bmp"またはAssignTPictureに保存すると、正しく動作しません。 ビットマップではない拡張子 ".bmp"のファイルを生成します。 - 利用TBitmap.Canvas

  • BMP:今、私は特別なケースごとに単一のファイル形式を含まない溶液を理解することはできません。
  • wmf/emf:TMetafileCanvasを使用してください。
  • などなど

あなたは私のための任意のアイデアを持って知っていますか?

+2

BMP、PNG、GIF、JPGなどを保存するためのルーチンを作るのは非常に簡単ですが、WMFやEMFも含めるのであれば、ベクタイメージ*フォーマットであり、前者はラスタイメージ*フォーマットです。 EMF/WMFに埋め込まれたラスタービットマップとして保存することを選択しない限り、もちろんEMF/WMFフォーマットを使用するのは簡単ではありません。 –

+0

特殊ケースwmf/emf OKだろう。あなたが言いたい統一ルーチンへのポインタを私に与えることができますか? –

+0

PS:私はメタファイルに描画し、それを 'TPicture'に' Assign 'することは、記録されたGDI呼び出しの集合のようなものであるように思えるでしょう。 –

答えて

9

私はこのような単純なおそらく「ダム」の変換を考え推測:

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への変換方法がわからず、その逆もありません。

ファイル形式に固有の透明性やその他の効果を維持する、より効率的な変換方法を開発できますが、それは私の知る限りです。しかし、あなたのニーズに応じて、それは十分かもしれません。

+0

もし 'AGraphicがvGraphicClassならば'をチェックし、それが真であればビットマップ変換をスキップするのはおそらく価値があります。そうしないと、JPEGをJPEGとして保存しても画質が低下します。 –

+0

または、SaveGraphicAs関数を呼び出すことをスキップして、AGraphic.SaveToFileを呼び出します。切り抜くことができる他のいくつかの問題があります。第三者が独自のPNGクラスを登録することができます(DevExpressはこれを行います)。だからあなたは 'TdxPNGImage is TPNGImage'で終わるでしょう(これは誤りでしょう)。現在のところ、指定された拡張機能の現在登録されているクラスを取得することは現時点では不可能です(2008年1月24日に要求されたQC57402 ...まだ開いています)。おそらく、呼び出し元がグラフィックがすでに適切な形式になっているかどうかを判断する方が簡単です。しかし、ええ、私はそれを最適化することを傷つけないだろうと思います。 –

関連する問題