我遇到了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位圖:。 (我的系統分辨率爲96 DPI,Windows XP中,.NET 4)
當我運行該程序,第一圖像清晰,而第二個是模糊的:
不同的來源,包括一些在這裏stackoverflow,建議不同的解決方法。 (例如,這些帖子:[1],[2]和[3]。)我嘗試瞭解決方法,他們似乎工作。在主窗口上使用UseLayoutRounding="true"
會使兩幅圖像變得銳利。在圖像上使用RenderOptions.BitmapScalingMode="NearestNeighbor"
也會使其變得銳利。
問題是,爲什麼SnapsToDevicePixels="True"
沒有解決方法?這是WPF中的錯誤還是我錯誤地使用它?
鑑於模糊圖像是「SnapsToDevicePixels」的基本使用案例之一,我覺得很可惜,[MSDN](http://msdn.microsoft.com/zh-cn/library/ system.windows.uielement.snapstodevicepixels.aspx)。 – Vlad
@Vlad - 是的,不知道爲什麼它不適用於圖像。除了它可能需要渲染外部界限,如果它試圖對齊設備像素。看起來UseLayoutRounding應該從一開始就包含在內。 – CodeNaked