将图片保存为各种文件格式

时间:2011-09-07 17:17:31

标签: delphi canvas save delphi-2007 image

我有一个例程procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect),可以在TCanvas上绘制一些指定的矩形。目前我用PaintBox的画布调用DrawStuff。现在我添加了一个Save as选项,用户可以从中选择各种文件格式(bmp,wmf,jpg,... - 最好是尽可能多的TGraphic后代)来保存DrawStuff到。

的结果

绘制为TMetafile并将其保存为“bla.bmp”或Assign将其设置为TPicture无法正常工作 - 例如它会生成扩展名为“.bmp”的文件,不是位图。现在我无法找到一种不涉及特殊套管的解决方案:

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

你知道对我有什么想法吗?

1 个答案:

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

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