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" 且不是位图的文件.现在我无法找到一个不涉及特殊套管的解决方案:
TBitmap.Canvas.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,反之亦然.
可以开发更有效的转换方法,以保持文件格式特定的透明度和其他效果,但这是我的知识.但根据您的需求,这可能就足够了.
| 归档时间: |
|
| 查看次数: |
7084 次 |
| 最近记录: |