我猜“哑”的转换可能会像这样简单:
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调用的集合。 –