2011-08-03 40 views
4

我遇到了WPF中的位图图像的问题。当图像容器在非整数的位置开始时,图像似乎不遵守SnapsToDevicePixels的值。SnapsToDevicePixels不适用于图像?

示例代码:

<Window x:Class="BlurryImage.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="110" Width="200"> 
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> 
     <Button SnapsToDevicePixels="True"> 
      <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/> 
     </Button> 
     <Button SnapsToDevicePixels="True" Margin="10.333333,0,0,0"> 
      <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/> 
     </Button> 
    </StackPanel> 
</Window> 

(注左边距的值:10.333333)

在这里,图像i16.png是在96 DPI的分辨率与细的垂直线的简单的16×16位图:image here。 (我的系统分辨率为96 DPI,Windows XP中,.NET 4)

当我运行该程序,第一图像清晰,而第二个是模糊的:blurry image screenshot

不同的来源,包括一些在这里stackoverflow,建议不同的解决方法。 (例如,这些帖子:[1],[2][3]。)我尝试了解决方法,他们似乎工作。在主窗口上使用UseLayoutRounding="true"会使两幅图像变得锐利。在图像上使用RenderOptions.BitmapScalingMode="NearestNeighbor"也会使其变得锐利。

问题是,为什么SnapsToDevicePixels="True"没有解决方法?这是WPF中的错误还是我错误地使用它?

回答

4

从这个blog entry

SnapsToDevicePixels

WPF预计将有人们想要对准 与像素网格而不是使用子像素精度的情况下。您可以在任何UIElement上设置 SnapsToDevicePixels属性。这会导致我们 尝试渲染到像素网格,但有很多情况下 不起作用 - 包括图像。我们将在未来寻求改进 。

所以这只是SnapsToDevicePixels可以做的一个已知限制。

+0

鉴于模糊图像是“SnapsToDevicePixels”的基本使用案例之一,我觉得很可惜,[MSDN](http://msdn.microsoft.com/zh-cn/library/ system.windows.uielement.snapstodevicepixels.aspx)。 – Vlad

+0

@Vlad - 是的,不知道为什么它不适用于图像。除了它可能需要渲染外部界限,如果它试图对齐设备像素。看起来UseLayoutRounding应该从一开始就包含在内。 – CodeNaked

相关问题