【问题标题】:WMF rendered badly with PlayEnhMetafileWMF 使用 PlayEnhMetafile 渲染不佳
【发布时间】:2015-09-30 10:50:05
【问题描述】:

这是为熟悉 WMF/EMF 格式的人准备的问题。

我想知道为什么附加的元文件不能使用 PlayEnhMetafile 正确呈现(在使用 SetWinMetaFileBits 转换后,我正在 Delphi 中对其进行测试)。它无法与许多其他应用程序(例如 Total Commander 查看器、Irfanview...)一起正确呈现,但使用 MS Office 2010 图像查看器可以正确呈现。

注意:此图片来自 MS Word 2010 生成的 RTF 文件,是 Equation Object 的结果。

可能是什么原因以及如何正确渲染此图像。

Link to image

【问题讨论】:

  • 你能展示你的代码吗,一个MCVE
  • 我想首先知道为什么它在我提到的那些应用程序中呈现不同的原因会很高兴。
  • 如果不知道你是如何渲染的,我们怎么知道呢?您不会显示您的代码,也不会显示您的图像是如何呈现的。感觉就像你没有完全投入。
  • @DavidHeffernan,他确实说它在 Word 中正确呈现,但在其他应用程序中却不正确 - 这很容易重现。
  • @user3777363,看起来有一个虚假的R0005: [009] EMR_SETWINDOWEXTEX (s=16) {szlExtent(1366,768)} 导致大多数客户端忽略第二个窗口大小,即R0011: [009] EMR_SETWINDOWEXTEX (s=16) {szlExtent(7104,992)}。这会导致 X 轴上的所有内容都模糊不清,但由于它是 EMF,所有文本仍以正确的纵横比绘制。至于如何修复或补偿,我不知道。

标签: winapi wmf


【解决方案1】:

Windows 元文件似乎不喜欢转换为Enhanced 元文件。以下代码似乎按预期呈现wmf

[DllImport("gdi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern IntPtr GetMetaFile(string filename);

[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
private static extern bool PlayMetaFile(IntPtr hdc, IntPtr hmf);

var bmpNew = new Bitmap(7104, 992);
using (var gfx = Graphics.FromImage(bmpNew))
{
    var bmpHdc = gfx.GetHdc();
    var mfHdc = GetMetaFile(@"C:\Users\mrtel_000\Desktop\test.wmf");
    var res = PlayMetaFile(bmpHdc, mfHdc);
    if (!res)
    {
        throw new Win32Exception();
    }
    gfx.ReleaseHdc();
}

bmpNew.Save("demo.png");

以上明显是资源泄露,但演示了正常播放。

结果:


(Click for Full Size)

【讨论】:

  • 谢谢,现在很明显 SetWinMetaFileBits 搞砸了这个图像。看来我必须使用已弃用的 WinAPI 函数(MSDN 网络上不再记录),希望将来不会有危险。
  • @user Mitch 在这里做得很好。你可能会接受他的回答。
猜你喜欢
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多