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

时间:2009-02-26 19:19:22

标签: .net wpf image xaml

我在WPF applcation中使用了一些图像。

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"行没有阻止此问题?

12 个答案:

答案 0 :(得分:221)

您可能需要考虑尝试在 WPF4 中使用新属性。将RenderOptions.BitmapScalingMode保留为 HighQuality ,或者不要声明它。

NearestNeighbor 为我工作,除了它在放大应用程序时导致锯齿状位图。它似乎也没有解决任何图标以奇怪的方式进行大小调整的故障。

在您的根元素(即您的主窗口)上添加以下属性:UseLayoutRounding="True"

以前只在Silverlight中可用的属性现在修复了所有Bitmap大小调整问题。 :)

答案 1 :(得分:71)

而不是使用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" />

以下是它现在的样子:

Crisp WPF Images http://img13.imageshack.us/img13/9926/crispwpfimages.gif

答案 2 :(得分:22)

+1 Zack Peterson

我正在使用.Net 3.5 sp1,它看起来像是大量模糊图像最简单的解决方案。 在适当的位置指定RenderOptions并不是什么大不了的事,但对于第三方组件,应用级资源中的样式是有意义的:

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

当AvalonDock开始渲染模糊图标时,工作得很顺利。

答案 3 :(得分:8)

在根窗口上使用UseLayoutRounding="True"在许多情况下都有效,但在使用 WPF功能区控件时遇到了问题。我的应用程序依赖于根据用户正在执行的操作而显示的上下文选项卡,当我将UseLayoutRounding设置为True时,上下文选项卡将不会显示,而RibbonButton的图像也不会显示。此外,应用程序冻结了几秒钟,CPU风扇开始唱歌。

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

答案 4 :(得分:5)

RenderOptions.BitmapScalingMode =“NearestNeighbor”在大多数情况下效果很好。然而,偶尔你会得到图形故障(在我的情况下,5个图像中有4个显示正常,但第五个在右边缘有轻微的扭曲)。我修正了我将Image控件的右边距增加1。

如果仍然无法修复它,请尝试上面EugeneZ提到的Bitmap类控件。它是Image控件的替代品,到目前为止它对我来说效果很好。见http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

答案 5 :(得分:4)

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

可能是类似的东西。

答案 6 :(得分:4)

UseLayoutRounding = True 用于应用中最顶层的元素

答案 7 :(得分:2)

我相信这是一个错误(或者至少它是)。查看此Microsoft support e-mail exchange页面,了解一些解决问题的方法。

答案 8 :(得分:2)

我发现RenderOptions.BitmapScalingMode =“NearestNeighbor”对我不起作用。我正在使用Windows XP x32和DirectX 9.0c。由于WPF的实际渲染是使用DirectX完成的,因此可能会产生影响。我使用以下注册表项为XP启用了抗锯齿功能:

[HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ Avalon.Graphics] “MaxMultisampleType”= DWORD:00000004 “EnableDebugControl”= DWORD:00000001

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

最后,我发现模糊发生在TextBlocks的文本和图像上。并且模糊只发生在一些文本块和图像上,而不是全部。

答案 9 :(得分:2)

我发现没有建议的解决方法的组合可以解决我看似随机模糊的图像问题。我喜欢很多其他人无法升级到.net 4以便使用UseLayoutRendering属性。

我发现了什么工作:

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

答案 10 :(得分:0)

我首先想到的是,在阅读这个问题时,你的图像太多了,但看起来你的应用程序图像看起来并不是这样。

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

如果你能完全排除上述两个问题,我现在很难过。

作为实验,您可以尝试其他图形格式,但PNG应该没问题。我将不得不考虑更多来提出更好的答案。

答案 11 :(得分:0)

我尝试使用RenderOptions.BitmapScalingMode = HighQuality,似乎是导致Windows 8.1中的一些问题,所以我做的是通过名为PngOut.exe的工具运行它们

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

这减少了png的标题,也减小了尺寸,但没有改变图像质量。

现在我的所有图片都很完美! :-)