【问题标题】:WPF Anti-aliasing edge of turned elementsWPF 旋转元素的抗锯齿边缘
【发布时间】:2015-08-27 11:00:27
【问题描述】:

我比平时更需要 Anti-alias 我的转矩形的边缘。

我的代码是这样的:

    <Rectangle Margin="20,20,147,135" Fill="#FFCAD2DE" RenderOptions.EdgeMode="Unspecified">
        <Rectangle.Effect>
            <DropShadowEffect BlurRadius="4" ShadowDepth="2" Opacity=".5"/>
        </Rectangle.Effect>
        <Rectangle.RenderTransform>
            <RotateTransform CenterX="0" CenterY="0" Angle="6" />
        </Rectangle.RenderTransform>
    </Rectangle>

我以编程方式慢慢改变角度...

但结果在某些角度出现混叠,如下图(左侧)。我希望矩形的边缘在所有角度都完全平滑,如下图(右侧)。


EDIT1:

我使用 .NET 3.5

【问题讨论】:

  • 我认为您必须提供更好的代码示例。如果我将您的代码复制粘贴到一个空的 WPF 应用程序中,它会非常抗锯齿:imgur.com/smOP0JT
  • @vesan 感谢您的测试,为您的空 WPF 应用程序使用 .Net 3.5,然后重建项目并运行...您看到了什么?我写了一个答案。这些步骤对我帮助很大。
  • 用 .NET 3.5 测试过,你是对的,它看起来更糟。很高兴你找到了一个解决方案,你的答案写得很好

标签: wpf antialiasing


【解决方案1】:

以下步骤会有所帮助


A)

首先我将我的项目从 .NET 3.5 移到 .Net 4.5 没有任何更改,结果是:

看起来非常流畅


B)

Layout Rounding

What is Layout Rounding and how to use it in WPF 4

当对象边缘落在像素设备的中间时, 独立于 DPI 的图形系统可以创建渲染工件,例如 作为模糊或半透明的边缘。

包括以前版本的 WPF 像素捕捉来帮助处理这种情况。 Silverlight 2 介绍 布局舍入,这是另一种移动元素的方法,以便边缘 落在整个像素边界上。

WPF 现在支持布局舍入 FrameworkElement 上的 UseLayoutRounding 附加属性。绘画 像素边界上的对象消除了半透明边缘 由抗锯齿产生,当边缘落在中间 设备像素。当您使用布局舍入时,布局系统会创建 列或行测量值的微小变化,以避免亚像素 渲染。

以下代码使用 UseLayoutRounding 附加属性设置在单个像素宽度线上。当您慢慢调整窗口大小时,您可以看到布局舍入带来的不同。

<StackPanel Width="150" Margin="7" Orientation="Horizontal">
  <!-- Single pixel line with layout rounding turned OFF.-->
  <Rectangle UseLayoutRounding="False" Width="45.6" Margin="10" Height="1" Fill="Red"/>

  <!-- Single pixel line with layout rounding turned ON.-->
  <Rectangle UseLayoutRounding="True" Width="45.6" Margin="10" Height="1" Fill="Red"/>
</StackPanel> 


C)

SnapsToDevicePixels

注意

您应该在 root 上将 UseLayoutRounding 设置为 true 元素。布局系统将子坐标添加到父坐标 坐标;因此,如果父坐标不在像素上 边界,子坐标也不在像素边界上。

如果UseLayoutRounding不能设置在根目录,设置 SnapsToDevicePixels 在孩子身上获得你想要的效果。

【讨论】:

    【解决方案2】:

    这似乎是不可能的:RotateTranform causes alias edges on border control or a Rectangle.

    从那里:

    幸运的是,边缘在我的电脑上旋转 25 度以上时变得非常平滑。如果您最终找到解决问题的方法,请与我们分享。这对有类似问题的其他社区成员非常有益。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多