2

在当前正在开发的 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,
    }
}

谢谢

在此处输入图像描述

4

2 回答 2

1

尝试将SnapsToDevicePixels设置为True您的图像,或者根元素可能位于您的窗口中,以防您希望所有 UIElements 自动继承该属性。

来自MSDN -

WPF 图形系统使用独立于设备的单元来实现分辨率和设备独立性。每个独立于设备的像素会根据系统的每英寸点数 (dpi) 设置自动缩放。这为 WPF 应用程序提供了针对不同 dpi 设置的适当缩放,并使应用程序自动识别 dpi。但是,由于抗锯齿,这种 dpi 独立性会产生不规则的边缘渲染. 当边缘的位置落在设备像素的中间而不是设备像素之间时,可能会出现这些伪影,通常被视为模糊或半透明的边缘。为了解决这个问题,WPF 提供了一种方法,让视觉树中的对象边缘通过像素捕捉捕捉或固定到设备像素,消除了由抗锯齿产生的半透明边缘。

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

  • 设置UseLayoutRenderingtrue图像。
  • 设置RenderOptions.BitmapScalingModeNearestNeighbor
于 2013-11-07T18:25:26.803 回答
0

简单来说,抗锯齿通过混合附近的像素来减轻锯齿状边缘的作用。对于您的线条,您可以预期线条边缘周围的几个像素与边缘部分混合。它们可能降低了不透明度,但有一些东西存在;它们不是“额外的”像素,因为它们确实有内容

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

于 2013-11-07T17:47:08.977 回答