2009-11-23 213 views
7

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

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

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

+2

如果一切都失败了,你可能可以在四倍左右的大小绘制它,然后下采样。 – Joey 2009-11-23 13:30:15

+0

我试过这个,在小尺寸这仍然看起来很丑也使用这种方法有一个丑陋的内存开销。 (我会一次显示很多这样的UserControls)。 – bitbonk 2009-11-23 17:33:04

+0

Duplicate:http://stackoverflow.com/questions/1422949/emf-with-forced-antialiasing – liori 2009-11-23 17:36:47

回答

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

...哦,并且通知还评论#3 CodeProject上的网页上。看起来有人以前曾经撞过墙壁。希望这能解决你的问题。

+0

这些程序似乎只是将其转换为其他文件格式。我们选择EMF来显示矢量图,因为这是GDI +可以处理的唯一矢量格式。我们需要从代码(因此GDI +)中汲取艺术,因为我们在运行时动态修改它并对其进行动画处理。使用GDI +显示emf最有可能是用于显示矢量图形的CPU和内存最友好的方式。使用emf的另一种格式似乎没有帮助。一个很酷的解决方案是将Vectorgrafik(任何格式)转换为C#GDI + instrructions转换器。 – bitbonk 2009-11-26 12:02:21

+0

在这种情况下,为什么不使用保留模式绘图系统并一并省略EMF?从理论上说,您可以存储EMF图像并使用自定义库来提取每个形状,并使用GDI(+)再次绘制它们。然而,从你对这个问题的描述中,我会创建一个专有格式来描述使用对象的图像,然后将其渲染到任何表面。 另一种方法可以是使用swf,这种方法支持得更好,记录完善,IMO更通用。 – Pedery 2009-11-26 16:55:34

+0

我们不能使用propietary格式,因为我们需要使用通用的绘图软件(illustrator,inkscape,coreldraw ...其中之一)来绘制艺术品。 – bitbonk 2009-11-26 22:13:36

4

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

在代码中复制它与重新实现GDI是一样的,所以它不是非常可行。并非不可能,只是一项比益处更大的工作才能证明自己的理由。如果有一个可以在Windows之外打开EMF文件的开源实用程序,则可以查看源代码。

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

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的解决方案,并且编写了一些调优的开源代码,以防万一这种方法不可用。