gpt4 book ai didi

delphi - 将 EMF 文件转换为位图并获得正确的大小

转载 作者:行者123 更新时间:2023-12-02 00:12:48 28 4
gpt4 key购买 nike

场景是我有一个打印机 EMF 文件。我想在将其发送到打印机之前在其上覆盖一些数据。打印机文件为 300dpi。保持相同的打印质量非常重要。

我正在使用此代码转换 emf 文件...

  b:=TBitmap.create;
MyMetaFile.LoadFromFile(emf);
MyCanvas:= TMetafileCanvas.Create(MyMetaFile, 0);
try
Width:=MyMetaFile.Width;
Height:=MyMetaFile.Height;

b.width:=width;
b.height:=height;
b.Canvas.Draw(0, 0, MyMetaFile);
b.SaveToFile('c:\emftest.bmp');

这种方法是有效的,只是你只能得到 emf 文件的左上角。如果你在 Windows 中查看 EMF 文件的属性,它会显示 2551x3301。但这里的宽度和高度设置为613x792。如果我用这些值覆盖 b.width 和 b.height 就可以了,但我显然不想这样做。 EMF文件为300dpi,屏幕dpi约为100,但误差为4.16。知道这里发生了什么吗?

谢谢特里

最佳答案

您必须在此处使用 StrechDraw 而不是 Draw,以便将内容缩放到预期的位图大小。

例如:

function MetafileToBitmap(Source: TMetafile; ScaleX,ScaleY: integer): TBitmap;
var R: TRect;
begin
result := nil;
if Source=nil then // self=nil is OK below
Exit;
R.Left := 0;
R.Right := (Source.Width*ScaleX)div 100;
R.Top := 0;
R.Bottom := (Source.Height*ScaleY)div 100;
result := TBitmap.Create;
result.Width := R.Right;
result.Height := R.Bottom;
Dec(R.Right); // Metafile rect includes right and bottom coords
Dec(R.Bottom);
PlayEnhMetaFile(Result.Canvas.Handle,Source.Handle,R);
end;

如果您想使用 GDI+ 进行抗锯齿绘图,则需要枚举图元文件内容,然后使用 our Open Source SynGdiPlus unit 进行渲染。 :

function LoadFrom(const MetaFile: TMetaFile): TBitmap;

关于delphi - 将 EMF 文件转换为位图并获得正确的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353950/

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