我遇到了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