画emf antialiased

时间:2009-11-23 13:28:34

标签: c# .net gdi+ antialiasing

有没有办法在启用了抗锯齿功能的情况下绘制emf元文件(从绘图工具导出)?我尝试的工具无法导出emf文件,因此我想知道在我的控件的OnPaint覆盖中绘制emf时是否可以手动将其重新打开。

如果有人能够确认在技术上可以生成抗锯齿emf文件,那么另一种解决方案是使用可以导出到抗锯齿emf的绘图工具,或者让第三方转换器稍后执行此操作。如果有人知道这样的工具,请告诉我。

编辑:当看emf instructions时,似乎emf本身并不能真正存储信息,无论是否要进行抗锯齿处理。至少我找不到任何东西。抗锯齿更有可能是由回放引擎完成的。例如,当我在Word 2007中打开一个emf时,它会被渲染为抗锯齿。但是当我用GDI +“回放引擎”(Graphics.DrawImage(...))绘制它时。或者当我查看标准的Windows图像查看器时。 这让我相信一些工具实际上有自己的emf播放引擎。所以也许有免费的.NET库(最好带有源代码)给我一个存储在解析的emf文件中的emf指令的对象模型,这样我就可以自己播放而不是使用Graphics.DrawImage(...)

3 个答案:

答案 0 :(得分:9)

我们在DirectX项目中遇到了类似的问题。升级和降尺度在一定程度上起作用,但它正在伪造它。如果这是你需要反复做的事情,你或许可以解析WMF的记录并用GDI +抗锯齿来绘制它们。

以下线程支持这一点(但它们是从2005年开始的,所以事情可能已经改变了):

http://www.dotnet247.com/247reference/msgs/28/144605.aspx

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-sdk/1127/Graphics-DrawImage-metafile-no-antialiasing

[编辑:]

这三个程序可能为你完成这项工作:我假设你可以手工完成:

http://emf-to-vector-converter-command-line-ser.smartcode.com/info.html

http://www.verypdf.com/pdf-editor/index.html

http://www.ivanview.com/converter/emf-batch-converter.html

[编辑II:]

嗯,这是一个让你以各种方式检查EMF的程序:

http://download.cnet.com/windows/3055-2383_4-10558240.html?tag=pdl-redir

...这里有一个免费软件库,可以解析122个EMF命令并将它们输出到GDI +中。这应该可以解决问题:

http://www.codeproject.com/KB/GDI-plus/emfexplorer.aspx?msg=2359423

...哦,请注意codeproject页面上的注释#3。看起来有人曾经撞过墙头。希望这能解决你的问题。

答案 1 :(得分:4)

EMF正在使用GDI命令,而不是GDI +,所以它没有抗锯齿的概念。我怀疑当你要求GDI +渲染文件时,它会将它发送给GDI并只复制生成的位图。

在代码中复制它与重新实现GDI相同,因此它并不十分可行。并非不可能,只是一项比利益更大的工作。如果有一个可以在Windows之外打开EMF文件的开源实用程序,您可以查看源代码。

我的猜测是Word正在使用下采样技巧。

答案 2 :(得分:3)

EMF文件是GDI命令列表。所以它不会被反对,即使在GDI +下,你在绘图之前调用了SmoothingMode()。您必须枚举GDI命令,然后将其转换为GDI +命令。

在Vista / Seven下,您可以使用名为GdipConvertToEmfPlus / ConvertToEmfPlus的GDI + 1.1函数。如果您希望程序与XP一起使用,则应编写自己的枚举,然后转换为GDI +命令。

GDI枚举然后转换为GDI +是由emfexplorer完成的,但是我写了some code perhaps more easy to follow,即使它是用Delphi编写的。

我刚刚给出了这个答案(我迟到了),因为我花了很多时间使用ConvertToEmfPlus找到解决方案,并编写一些调优的开源代码,以防这个方法不可用。