gpt4 book ai didi

delphi - 将图片保存为多种文件格式

转载 作者:行者123 更新时间:2023-12-03 14:51:55 26 4
gpt4 key购买 nike

我有一个惯例procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect)将某些内容绘制到 TCanvas 上的指定矩形上。此刻我调用DrawStuff与 PaintBox 的 Canvas 。现在我添加一个Save as选项,用户应能够从各种文件格式(bmp、wmf、jpg... - 最好是尽可能多的 TGraphic 后代)中进行选择,以保存 DrawStuff 的结果。到。

绘制到 TMetafile并将其保存为“bla.bmp”或 Assign将其转换为 TPicture无法正常工作 - 例如它生成扩展名为“.bmp”的文件,这些文件不是位图。现在我想不出一个不涉及对每种文件格式进行特殊处理的解决方案:

  • bmp - 使用TBitmap.Canvas .
  • wmf/emf:使用TMetafileCanvas .
  • 等等。等等

你知道我有什么想法吗?

最佳答案

我想“愚蠢”的转换可能会像这样简单:

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,反之亦然。

可以开发更有效的转换方法,以保持特定于文件格式的透明度和其他效果,但这超出了我的知识范围。但根据您的需求,这可能就足够了。

关于delphi - 将图片保存为多种文件格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com