当渲染元文件时,文本过大。

5
我在Delphi XE应用程序中使用metafile呈现时遇到了问题。
问题在于,当我呈现metafile时,文字太大了。Irfanview和FastReports以这样的方式渲染它:
(图像中左侧的文字)
但windows 7 Paint可以正常呈现它:(这是文字应该呈现的样子)
(图像中左侧的文字)
有任何想法是什么原因导致这个问题?
谢谢!

5
你是如何创建元数据文件的?还有相关的代码吗? - David Heffernan
感谢您的评论。@DavidHeffernan:元文件是由第三方绘图引擎创建的。 - X-Ray
我正在使用元文件,因此它是一种“向量化”的文件格式,旨在为打印呈现报告画布时提供良好的效果。 - X-Ray
好的,但是你在问题中提到了位图,它们不是矢量图,而是光栅图。 - David Heffernan
2
根据评论在此处编辑以删除位图提及 - Argalatyr
显示剩余2条评论
3个回答

4
emf文件只是一系列GDI命令的列表。实际上,系统可以使用标准的Windows GDI命令(在Delphi中,TMetaFile只是这些API的包装器)非常容易地“回放”它们。当IrfanViewFastReport呈现元文件内容时,它们只使用Windows GDI相应的命令。当Windows 7 Paint呈现元文件内容时,它使用GDI+渲染器。我甚至认为它在内部将emf文件转换为emf+格式,然后使用GDI+进行抗锯齿渲染。

因此,如果IrfanViewFastReport中的emf文件呈现不正确,我怀疑这是因为您的元文件格式不正确:您正在使用的第三方图形引擎正在生成非标准的emf。可能的问题是所使用的字体在目标系统中丢失,而GDI不会像GDI+那样用相同的字体替换字体。

另一个可能性是emf文件可能是双重格式:它包含emf格式(未经正确创建,因此不能使用GDI正确呈现)和emf+格式(使用GDI+呈现如预期)。通常,这种双重emf/emf+格式不应存在:即使官方的GDI+库也不允许将其元文件内容保存为emf+。这是一种由您的第三方库创建的“怪物”格式。

我建议以下操作:

  • 使用EmfExplorer下载并检查您的emf文件;
  • 尝试使用GDI+呈现元文件;
  • 尝试使用emfemf+转换器API。

要使用GDI+,请查看开源的SynGdiPlus单元:它将在您生成的位图中添加GDI+抗锯齿。它能够将emf转换为emf+。它将使用本机Vista / Seven API(就像Windows 7画图一样),或在Windows XP下使用纯Delphi代码。


2
可能的原因是不同的监视器尺寸和屏幕分辨率比例。 GDI 有参数 HORZRES,HORZSIZE,VERTRES,VERTSIZE。在大多数情况下,HORZRES/VERTRES、HORZSIZE/VERTSIZE(分辨率比例和屏幕比例)是相同的,一切正常...然而,如果它们不同(我在服务器上发现了一些这样的例子),则假定像素是矩形的,这会导致 LOGFONT.lfWidth 被错误地计算。LOGFONT.lfWidth 确定字符的宽高比,最终导致字母看起来很奇怪。
解决方案之一是更改分辨率,使 HORZRES/VERTRES、HORZSIZE/VERTSIZE 匹配。另一个解决方案是使用打印机 DC 来渲染您的内容。显式设置 LOGFONT.lfWidth 值可能有帮助。此外,更新视频驱动程序也可以有所帮助。
我遇到了同样的问题,我暂时将绘图画到元文件画布上,它使用 GetDC(0) 作为参考,而不是打印机 DC。这里有一些链接有相同的问题:

0
有点冒险,但是:
也许与Vista+中新的系统字体有关,这些字体是较新版本的Delphi支持的?如果在移植过程中发生了这种情况,请固定旧版本和新版本中使用的tmetafile中使用的字体。

2
在OP的代码中不知道参考设备上下文,那只是瞎猜。 - Martin Reiner
没有想到这个。我要去找供应商谈谈。谢谢! - X-Ray
4
马丁:嗯,这就是“赌博”的意思啊 :-) - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接