首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制emf抗锯齿

绘制emf抗锯齿
EN

Stack Overflow用户
提问于 2009-11-23 21:28:34
回答 3查看 4.7K关注 0票数 7

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-24 02:10:07

我们在一个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

EMF这里有一个免费的库,它可以让你解析122个...and命令并以GDI+格式输出它们。这可能会起到作用:

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

...oh,并注意代码项目页面上的注释#3。看起来像是有人把头撞到墙上了。希望这能解决你的问题。

票数 9
EN

Stack Overflow用户

发布于 2009-11-26 03:47:17

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-01-21 02:48:19

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找出一个解决方案,并编写了一些经过调优的开放源代码,以防这个方法不可用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1783130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档