Winapi 使用PlayenMetaFile渲染WMF时效果不佳

Winapi 使用PlayenMetaFile渲染WMF时效果不佳,winapi,wmf,Winapi,Wmf,对于熟悉WMF/EMF格式的人来说,这是一个问题 我想知道为什么附加的图元文件不能用PlayenMetaFile正确渲染(在用SetWinMetaFileBits转换后,我正在Delphi中测试它)。许多其他应用程序(如Total Commander viewer、Irfanview等)无法正确渲染,但使用MS Office 2010图像查看器可以正确渲染 注:此图像来自MS Word 2010生成的RTF文件,是等式对象的结果 原因可能是什么以及如何正确渲染此图像 看来Windows图元文件不

对于熟悉WMF/EMF格式的人来说,这是一个问题

我想知道为什么附加的图元文件不能用PlayenMetaFile正确渲染(在用SetWinMetaFileBits转换后,我正在Delphi中测试它)。许多其他应用程序(如Total Commander viewer、Irfanview等)无法正确渲染,但使用MS Office 2010图像查看器可以正确渲染

注:此图像来自MS Word 2010生成的RTF文件,是等式对象的结果

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


看来Windows图元文件不喜欢转换为增强的图元文件。以下代码似乎按预期呈现了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");
上述内容显然是在泄漏资源,但演示了正确的播放

结果:



()

你能展示你的代码吗,一个MCVEI首先我想知道为什么它在我提到的那些应用程序中呈现的方式不同会很好。如果不知道你是如何呈现的,我们怎么知道呢?您不会显示代码,也不会显示图像的渲染方式。感觉你没有完全投入。@DavidHeffernan,他确实说它在Word中呈现正确,但在其他应用程序中呈现不正确-这是很容易复制的。@user3777363,看起来有一个虚假的
R0005:[009]EMR_SETWINDOWEXTEX(s=16){szlExtent(1366768)}
导致大多数客户端忽略第二个窗口大小,这是
R0011:[009]EMR_SETWINDOWEXTEX(s=16){szlExtent(7104992)}
。这会导致X轴上的所有内容都模糊,但由于它是EMF,因此所有文本仍以正确的纵横比绘制。至于如何修复或补偿,我不知道。谢谢,现在很明显SetWinMetaFileBits把这个图像搞砸了。似乎我不得不使用不推荐使用的WinAPI函数(不再在MSDN web上记录),希望它不会对未来造成危险。@用户Mitch在这里做得很好。你可以接受他的回答。