SnapsToDevicePixels与图像不兼容?

5

我在WPF中遇到了位图图像的问题。当图像容器从非整数位置开始时,图像似乎不会遵守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 是一个简单的 16x16 的位图,分辨率为 96 DPI,具有细长的垂直线条:image here。(我的系统分辨率为 96 DPI,Windows XP,.NET 4)
当我运行程序时,第一张图片很清晰,而第二张模糊不清:blurry image screenshot 不同的来源,包括一些在 stackoverflow 上的帖子,提供了不同的解决方法。(例如,这些帖子:[1][2][3]。)我尝试了这些解决方法,它们似乎都有效。在主窗口上使用 UseLayoutRounding="true" 可以使两个图像都变得清晰。在图像上使用 RenderOptions.BitmapScalingMode="NearestNeighbor" 也可以使其变得清晰。
问题是,为什么不使用这些解决方法,SnapsToDevicePixels="True" 就无法正常工作?这是 WPF 的一个 bug 还是我使用方式有误?
1个回答

5

从这篇博客文章中:

SnapsToDevicePixels

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

所以这只是SnapsToDevicePixels的已知限制。


考虑到模糊图像是“SnapsToDevicePixels”最基本的使用情况之一,我觉得很遗憾这个错误没有在MSDN中提到。 - Vlad
@Vlad - 是的,我也不确定为什么它对图像无效。除非它尝试与设备像素对齐,否则可能需要在其边界外呈现。似乎从一开始就应该包括UseLayoutRounding。 - CodeNaked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接