转换元素的WPF消除锯齿边缘

时间:2015-08-26 04:10:03

标签: wpf antialiasing

我需要 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>

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

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

enter image description here

EDIT1:

我使用 .NET 3.5

2 个答案:

答案 0 :(得分: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现在支持使用布局舍入   UseLayoutRounding上的 FrameworkElement 附加属性。画画   像素边界上的对象消除了半透明边缘   当边缘落在a的中间时,由抗锯齿产生   设备像素。使用布局舍入时,布局系统会创建   列或行测量中的小变化以避免子像素   渲染。

以下代码使用在单个像素宽度线上设置的 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> 

enter image description here

C)

<强> SnapsToDevicePixels

  

注意

     

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

     

如果无法在根目录中设置UseLayoutRounding,请设置    SnapsToDevicePixels 让孩子获得你想要的效果。

答案 1 :(得分:0)

看起来好像不可能:RotateTranform causes alias edges on border control or a Rectangle.

从那里:

  

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