7

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

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

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

4

3 回答 3

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

[编辑二:]

好吧,这是一个程序,可以让您以各种方式检查 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。好像以前有人用头撞墙。希望这能解决您的问题。

于 2009-11-23T18:10:07.303 回答
4

EMF 使用的是 GDI 命令,而不是 GDI+,因此它没有抗锯齿的概念。我怀疑当您要求 GDI+ 渲染文件时,它会将其发送到 GDI 并仅复制生成的位图。

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

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

于 2009-11-25T19:47:17.437 回答
3

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

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

emfexplorer已经完成了 GDI 枚举然后转换为 GDI+ 的可能,但我编写了一些可能更容易理解的代码,即使它是用 Delphi 编写的。

我现在才提出这个答案(我迟到了),因为我花了很多时间寻找使用 ConvertToEmfPlus 的解决方案,并编写了一些经过调整的开源代码,以防这种方法不可用。

于 2011-01-20T18:48:18.643 回答