Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绘制反走样图_C#_.net_Gdi+_Antialiasing - Fatal编程技术网

C# 绘制反走样图

C# 绘制反走样图,c#,.net,gdi+,antialiasing,C#,.net,Gdi+,Antialiasing,是否有方法在启用抗锯齿的情况下绘制emf图元文件(从绘图工具导出)?我尝试的工具无法导出antaliased的emf文件,因此我想知道在控件的OnPaint覆盖中绘制emf时是否可以手动将其打开 如果有人能够确认生成抗锯齿emf文件在技术上是可行的,那么另一种解决方案是使用可以导出为抗锯齿emf的绘图工具,或者让第三方转换器稍后执行此操作。如果有人知道这样的工具,请告诉我 编辑:当查看时,似乎emf本身并不能实际存储信息,无论是否对其进行抗锯齿处理。至少我什么也找不到。消除混叠更有可能是由回放引

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

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

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

我们在DirectX项目中遇到了类似的问题。放大和缩小在一定程度上是可行的,但这是在假装。如果这是你需要反复做的事情,你也许可以解析WMF的记录并用GDI+抗锯齿绘制它们

以下线程对此进行了备份(但它们来自2005年,因此情况可能已经发生了变化):

[编辑:]

这三个程序可能适合你:我假设你可以用手来做:

[编辑二:]

好的,这里有一个程序可以让你用各种方式检查EMF:

…这里有一个免费软件库,可以让您解析122个EMF命令并在GDI+中输出它们。这可能会奏效:


…哦,还有请注意codeproject页面上的注释#3。看来以前有人用头撞过墙。希望这能解决您的问题。

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

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


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

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

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

GDI枚举然后转换为GDI+是可能的,但是我已经写了,即使它是用Delphi写的


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

如果所有其他方法都失败了,你可能可以以大约四倍的大小绘制它,然后再进行下采样。我尝试了这个方法,在小尺寸的情况下,这看起来仍然很难看。使用这种方法,内存开销也很难看。(我会一次显示很多这样的用户控件)。重复:小尺寸无论怎样看起来都很难看,因为你的点将被转换为整数像素边界。你必须选择最能接受的丑陋样式。不要忘记在下采样之前将InterpolationMode设置为HighQualityBicubic。那些程序似乎只是将其转换为其他文件格式。我们选择EMF来显示矢量艺术,因为这是GDI+能够处理的唯一矢量格式。我们需要从代码中绘制艺术(因此是GDI+),因为我们在运行时动态地修改它并为它设置动画。同时,使用GDI+显示emf很可能是显示矢量艺术最为CPU和内存友好的方式。使用另一种emf似乎没有帮助的格式。一个很酷的解决方案是使用Vectorgrafik(任何格式)到C#GDI+指令转换器。在这种情况下,为什么不使用保留模式绘图系统,同时省略EMF?理论上,您可以存储EMF图像并使用自定义库提取每个形状,然后使用GDI(+)再次绘制它们。但是,根据您对问题的描述,我会创建一种专有格式,只使用对象描述图像,然后将其渲染到任何有问题的曲面。另一种方法是使用swf,它的支持性好得多,有很好的文档记录,而且IMO的通用性更强。我们不能使用合适的格式,因为我们需要使用通用的绘图软件(illustrator、inkscape、coreldraw……其中之一)来绘制艺术。