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

Uli*_*rdt 7 delphi canvas image save delphi-2007

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

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

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

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

Ken*_*ssa 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;
Run Code Online (Sandbox Code Playgroud)

分配给TPicture不起作用,因为当您分配给TPicture时,TPicture会将图形转换为您指定的类.

请注意,在我的示例中,有两层转换,因为原始图像在转换为最终格式之前会转换为位图.在此过程中可能会有相当多的信息丢失.大多数(全部?)图形类型都知道如何与TBitmap进行转换,但TJPEGImage不知道如何转换为TPngImage,反之亦然.

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