我的图像很模糊! 为什么 WPF 的 SnapsToDevicePixels 不工作?

我正在我的 WPF 应用程序中使用一些图像。

XAML:

<Image Name="ImageOrderedList"
Source="images/OrderedList.png"
ToolTip="Ordered List"
Margin="0,0,5,5"
Width="20"
Height="20"
SnapsToDevicePixels="True"
MouseUp="Image_MouseUp"
MouseEnter="Image_MouseEnter"
MouseLeave="Image_MouseLeave" />

但是,它们看起来很模糊。

为什么 SnapsToDevicePixels="True"线不能防止这个问题?

61809 次浏览

读到这个问题时,我的第一个想法是,你把图片放大得太多了,但是看看你的应用程序图片,情况似乎并非如此。

第二个想法是调色板,但与黑色的颜色之一,是不正确的渲染,这是不太可能的。

如果你可以完全排除以上两种情况,我现在被难住了。

作为一个实验,您可以尝试其他图形格式,但 PNG 应该没问题。我得再仔细考虑一下才能想出更好的答案。

我相信这是一个错误(至少曾经是)。看看这个 Microsoft 支持电子邮件交换页面的一些想法来修复它。

我没有使用 SnapsToDevicePixels,而是使用了 RenderOptions.BitmapScalingMode,它们现在变得又好又脆!

XAML:

<Image Name="ImageOrderedList"
Source="images/OrderedList.png"
ToolTip="Ordered List"
Margin="0,0,5,5"
Width="20"
Height="20"
RenderOptions.BitmapScalingMode="NearestNeighbor"
MouseUp="Image_MouseUp"
MouseEnter="Image_MouseEnter"
MouseLeave="Image_MouseLeave" />

渲染选项。BitmapScalingMode = “ Nearest睦邻”在大多数情况下都能很好地工作。然而,偶尔你也会遇到图形小故障(在我的例子中,5张图片中有4张显示良好,但是第5张在右边缘有轻微的失真)。我修正了我的增加图像控件的右边距1。

如果这仍然不能修复它,试试 EugeneZ 提到的 Bitmap 类控件。这是一个替代的图像控件,到目前为止,它的工作相当不错。参见 http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

确保将图像保存在与 WPF 应用程序相同的 DPI 中,有些图像格式将这些信息存储为元数据。我不知道这是否解决了问题,但我有一些问题,因为这里的图像调整到100% 变得比预期的更大或更小。

可能是类似的东西。

您可能需要考虑尝试现在在 WPF4中可用的新属性。把 RenderOptions.BitmapScalingMode留给 高品质,或者干脆不声明它。

最近的邻居 对我来说很有用,只是它在放大应用程序时会导致位图参差不齐。它似乎也没有修复任何小故障,图标尺寸以奇怪的方式。

在根元素(即主窗口)上添加这个属性: UseLayoutRounding="True"

一个以前只能在 Silverlight 中使用的属性现在已经解决了所有 Bitmap 大小的问题。 :)

Zack Peterson 加1分

我使用的是.Net 3.5 sp1,它看起来像是大量模糊图像的最简单的解决方案。 指定就地渲染选项并不是什么大事,但是对于第三方组件来说,应用程序级别资源的样式是有意义的:

 <Style TargetType="{x:Type Image}">
<Setter
Property="RenderOptions.BitmapScalingMode"
Value="NearestNeighbor" />
</Style>

当 AvalonDock 开始渲染模糊的图标时,效果很好。

我发现渲染选项。BitmapScalingMode = “最近的邻居”对我不起作用。我使用的是 Windows XP x32和 DirectX 9.0 c。由于 WPF 的实际呈现是使用 DirectX 完成的,因此这可能会产生影响。我确实为 XP 打开了以下注册表项的反锯齿:

[ HKEY _ LOCAL _ MACHINE SOFTWARE Microsoft Avalon. Graphics ] “ MaxMultisampleType”= dword: 00000004 “ EnableDebugControl”= dword: 00000001

然而,用这些设置关闭 aa 对图像没有影响。我认为这只会影响3D 视口。

最后,我发现 TextBlock 的文本和图像都会出现模糊。而且模糊只发生在一些文本块和图像上,并不是所有的文本块和图像。

在根窗口上使用 UseLayoutRounding="True"在许多情况下都可以工作,但是我在使用 WPF 丝带控件时遇到了一个问题。我的应用程序依赖于上下文选项卡,这些选项卡根据用户的操作显示,当我将 UseLayoutRounding设置为 True时,上下文选项卡不会显示,RibbonButton 的图像也不会显示。此外,应用程序冻结了许多秒,CPU 风扇开始唱歌。

在我的图像上使用 RenderOptions.BitmapScalingMode="NearestNeighbor"纠正了图像渲染问题(模糊和裁剪图像) ,并且完全兼容 Ribbon 上下文选项卡的使用。

我已经发现,任何建议的变通方法组合都不能解决我看似随机的模糊图像问题。我喜欢很多其他人不能升级到。Net 4以使用 UseLayoutRendering属性。

我发现的有效方法:

  • 确保您的[原始]图像尺寸是2的倍数。这似乎可以防止一些时髦的图像缩放问题。
  • 有时我还发现,调整图像的边缘一个像素或2可以防止这个问题。

我试过使用渲染选项。BitmapScalingMode = HighQuality,似乎是在 Windows 8.1中导致了一些问题,所以我所做的就是通过名为 PngOut.exe 的工具运行它们

Http://advsys.net/ken/utils.htm

这减少了头的 png,也减少了大小,但没有改变图像质量。

现在我所有的形象都是完美的! : -)

使用 UseLayout舍入 = 真到应用程序中最顶部的元素