【问题标题】:Draw emf antialiased绘制 emf 抗锯齿
【发布时间】:2010-12-19 11:32:51
【问题描述】:

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

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

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

【问题讨论】:

  • 如果所有其他方法都失败了,您可能可以将其绘制成四倍左右的大小,然后进行下采样。
  • 我试过了,在小尺寸下这仍然看起来很丑陋同样使用这种方法可能会有丑陋的内存开销。 (我将一次显示很多这样的用户控件)。
  • 无论如何,小尺寸看起来都很难看,因为您的点将被投射到整数像素边界。你必须选择最容易接受的丑陋风格。
  • 在下采样之前不要忘记将 InterpolationMode 设置为 HighQualityBicubic。

标签: c# .net gdi+ antialiasing


【解决方案1】:

我们在 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。看来以前有人用头撞墙。希望这能解决您的问题。

【讨论】:

  • 那些程序似乎只是将其转换为其他文件格式。我们选择 EMF 来显示矢量图,因为这是 GDI+ 可以处理的唯一矢量格式。我们需要从代码中绘制艺术(因此是 GDI+),因为我们在运行时动态修改它并为其设置动画。此外,使用 GDI+ 显示 emf 很可能是显示矢量图的最 CPU 和内存友好的方式。使用 emf 似乎没有帮助的另一种格式。一个很酷的解决方案是使用 Vectorgrafik(任何格式)到 C# GDI+ 指令转换器。
  • 在那种情况下,你为什么不使用保留模式绘图系统并一起省略 EMF?理论上,您可以存储 EMF 图像并使用自定义库来提取每个形状并使用 GDI(+) 再次绘制它们。但是,根据您对问题的描述,我将创建一种专有格式,该格式仅使用对象描述图像,然后将其渲染到有问题的任何表面。一种不同的方法可能是使用 swf,它得到更好的支持、有据可查且 IMO 更通用。
  • 我们不能使用专有格式,因为我们需要使用通用绘图软件(illustrator、inkscape、coreldraw ......其中之一)来绘制艺术作品。
【解决方案2】:

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+ 命令。

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2010-10-03
      • 1970-01-01
      • 2023-04-07
      • 2011-02-14
      • 2014-02-18
      相关资源
      最近更新 更多