【问题标题】:when rendering metafile, the texts are too large渲染图元文件时,文本太大
【发布时间】:2012-02-04 21:31:44
【问题描述】:

我的 Delphi XE 应用程序中的图元文件呈现出现问题。

问题是当我渲染图元文件时,文本太大了。 Irfanview 和 FastReports 呈现如下:

windows 7 Paint 渲染得很好:(这是文本的样子)

任何想法是什么原因造成的?

谢谢!

【问题讨论】:

  • 你是如何创建元文件的?一些代码呢?
  • 在真实的计算机上更仔细地观察,我认识到这种效果。我已经通过我自己的程序的输出看到了它。我认为这只是一些包光栅化元文件的方式的本质。显然,元文件很好,因为一个包可以很好地呈现它。您应该查看的另一个程序是 Word。如果要导出以供光栅图形包使用,则最好导出为 PNG 格式的位图。
  • 感谢您的 cmets。 @DavidHeffernan:元文件由第 3 方图形引擎创建。
  • 我正在使用元文件,因此它是一种“矢量”文件格式,旨在很好地呈现到报表画布以进行打印。
  • 编辑删除位图的提及,这里的每条评论

标签: delphi


【解决方案1】:

emf 文件只是 GDI 命令的列表。事实上,它们可以很容易地被系统“回放”,使用标准的 Windows GDI 命令(在 Delphi 中,TMetaFile 只是这些 API 的包装)。

当IrfanView 或FastReport 渲染图元文件内容时,它们只是使用Windows GDI 对应的命令。当Windows 7 Paint 渲染图元文件内容时,它使用 GDI+ 渲染器。我什至认为它在内部将emf 文件转换为emf+ 格式,然后使用GDI+ 进行抗锯齿渲染。

所以如果emf 文件在IrfanView 或FastReport 中呈现不正确,我怀疑这是因为您的元文件格式不正确:您是第三方图形引擎使用正在产生非标准电动势。一个可能的问题是目标系统中缺少使用的字体,并且 GDI 不会像 GDI+ 那样用相同的字体替换该字体。

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

我建议如下:

  • 使用EmfExplorer 下载并检查您的emf 文件;
  • 尝试使用 GDI+ 渲染图元文件;
  • 尝试使用emf 到emf+ 转换器API。

要使用 GDI+,请查看 Open Source SynGdiPlus unit:它将为您生成的位图添加 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 的图元文件画布。以下是一些有同样问题的链接:

    【讨论】:

      【解决方案3】:

      有点赌,但是:

      也许与较新的 Delphi 支持的 Vista+ 中的新系统字体有关?如果在移植过程中出现,请将tmetafile中使用的字体固定在新旧版本中。

      【讨论】:

      • 在不知道 OP 代码中的参考设备上下文的情况下,这只是猜测。
      • 没想到。我要和供应商谈谈。谢谢!
      • 马丁:嗯,这就是“赌博”的意思:-)
      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 2010-09-22
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多