2011-08-03 87 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