在当前正在开发的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,
}
}
谢谢
答案 0 :(得分:1)
尝试在图片上设置SnapsToDevicePixels至True
,或者更确切地说,根元素可能位于您的窗口上,以防您希望所有UIElements自动继承该属性。
来自MSDN -
WPF图形系统使用设备无关单元启用 分辨率和设备独立性。每个设备独立的像素 自动按系统的每英寸点数(dpi)设置进行缩放。 这为不同的dpi提供了适当缩放的WPF应用程序 设置并使应用程序自动dpi感知。然而, 这个 dpi独立性可以创建不规则的边缘渲染 抗混叠即可。这些文物,通常被视为模糊,或 当边缘的位置下降时,可能出现半透明的边缘 在设备像素的中间而不是在设备像素之间。至 解决这个问题,WPF为视觉中的对象边提供了一种方法 树通过像素捕捉或固定到设备像素 捕捉,消除由此产生的半透明边缘 抗混叠
您也可以在SO上查看此链接here,详细说明其他更多选项,例如 -
UseLayoutRendering
至true
。RenderOptions.BitmapScalingMode
设为NearestNeighbor
。答案 1 :(得分:0)
在过度简化的术语中,抗锯齿通过混合附近的像素来减轻锯齿状边缘。对于线条,您可以预期线条边缘周围的几个像素将与边缘部分混合。他们可能会降低不透明度,但那里有某种东西;在他们确实有内容的意义上,它们不是“额外”像素。
如果您将用于保存视觉的代码发布到图像,我可能会帮助您调整剪裁以使其更加严格。但请注意,这可能会导致图像边缘出现锯齿线或顶点等伪影。