我猜「啞」的轉換可能會像這樣簡單:
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和從TBitmap轉換,但TJPEGImage不知道如何轉換爲TPngImage,反之亦然。
可以開發更高效的轉換方法,以保持文件格式特有的透明度和其他效果,但這是我的知識。但根據您的需求,這可能就足夠了。
製作保存BMP,PNG,GIF,JPG等的「統一」例程非常容易,但如果它也包含WMF或EMF,則很難做到,因爲後者*矢量圖像*格式,而前者是*光柵圖像*格式。當然,除非您選擇將圖像保存爲EMF/WMF中嵌入的柵格位圖,但在這種情況下,完全可以使用EMF/WMF格式... –
Special-casing wmf/emf會沒事的。你能指點一下你提到的統一套路嗎? –
PS:我認爲繪製到一個圖元文件,然後'將它分配給一個'TPicture'可能工作,因爲它似乎是像記錄的GDI調用的集合。 –