如何避免WPF中的抗锯齿?

时间:2013-11-07 17:24:20

标签: c# wpf wpf-controls

在当前正在开发的WPF应用程序中,用户能够在画布上绘制线条,当然在保存后,他可以看到几种不同的文件格式(例如输出,例如JPEG和专有文件格式)。这样可以正常工作,但JPEG版本应该被裁剪,当这种裁剪发生时,对象的顶部会有一些额外的像素。

在代码中我们使用了抗锯齿设置:

EdgeMode.Aliased; 

基于System.Windows.Media.EdgeMode

见下文。现在,当这被注释掉时,事情锻炼得很好,但是裁剪没有任何问题,但线条渲染的边缘更加清晰,这是不可接受的。

有人接触过这个问题吗?如果是这样,这个问题的解决方案或解决方法是什么?

#region Assembly PresentationCore.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\PresentationCore.dll
#endregion

using System;

namespace System.Windows.Media
{
    // Summary:
    //     Determines how the edges of non-text drawing primitives are rendered.
    public enum EdgeMode
    {
        // Summary:
        //     No edge mode is specified. Do not alter the current edge mode of non-text
        //     drawing primitives. This is the default value.
        Unspecified = 0,
        //
        // Summary:
        //     Render the edges of non-text drawing primitives as aliased edges.
        Aliased = 1,
    }
}

谢谢

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试在图片上设置SnapsToDevicePixelsTrue,或者更确切地说,根元素可能位于您的窗口上,以防您希望所有UIElements自动继承该属性。

来自MSDN -

  

WPF图形系统使用设备无关单元启用   分辨率和设备独立性。每个设备独立的像素   自动按系统的每英寸点数(dpi)设置进行缩放。   这为不同的dpi提供了适当缩放的WPF应用程序   设置并使应用程序自动dpi感知。然而,   这个 dpi独立性可以创建不规则的边缘渲染   抗混叠即可。这些文物,通常被视为模糊,或   当边缘的位置下降时,可能出现半透明的边缘   在设备像素的中间而不是在设备像素之间。至   解决这个问题,WPF为视觉中的对象边提供了一种方法   树通过像素捕捉或固定到设备像素   捕捉,消除由此产生的半透明边缘   抗混叠

您也可以在SO上查看此链接here,详细说明其他更多选项,例如 -

  • 在图片上设置UseLayoutRenderingtrue
  • RenderOptions.BitmapScalingMode设为NearestNeighbor

答案 1 :(得分:0)

在过度简化的术语中,抗锯齿通过混合附近的像素来减轻锯齿状边缘。对于线条,您可以预期线条边缘周围的几个像素将与边缘部分混合。他们可能会降低不透明度,但那里有某种东西;在他们确实有内容的意义上,它们不是“额外”像素。

如果您将用于保存视觉的代码发布到图像,我可能会帮助您调整剪裁以使其更加严格。但请注意,这可能会导致图像边缘出现锯齿线或顶点等伪影。