我有一个例程procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect)
,可以在TCanvas上绘制一些指定的矩形。目前我用PaintBox的画布调用DrawStuff
。现在我添加了一个Save as
选项,用户可以从中选择各种文件格式(bmp,wmf,jpg,... - 最好是尽可能多的TGraphic后代)来保存DrawStuff
到。
绘制为TMetafile
并将其保存为“bla.bmp”或Assign
将其设置为TPicture
无法正常工作 - 例如它会生成扩展名为“.bmp”的文件,不是位图。现在我无法找到一种不涉及特殊套管的解决方案:
TBitmap.Canvas
。TMetafileCanvas
。你知道对我有什么想法吗?
答案 0 :(得分:10)
我认为“愚蠢”的转换可能就像这样简单:
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,反之亦然。
可以开发更高效的转换方法,以保持文件格式特定的透明度和其他效果,但这是我的知识。但根据您的需求,这可能就足够了。