我的图像模糊! 为什么不是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" /> 

但是,他们似乎模糊:

死链接 – 模糊的WPF图像

这是一个放大,并排的比较。 原件在左边:

死链接 – 模糊的WPF图像放大

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

你可能要考虑尝试WPF4现在可用的新属性。 将RenderOptions.BitmapScalingMode保持为RenderOptions.BitmapScalingMode或者不要声明它。

最近的邻居为我工作,除了在放大应用程序时导致锯齿形的位图。 它也似乎没有修复任何图标在奇怪的方式大小的故障。

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

之前仅在Silverlight中提供的属性现在已经修复了所有的Bitmap大小问题。 🙂

而不是使用SnapsToDevicePixels ,而是使用RenderOptions.BitmapScalingMode ,他们现在很好,很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" /> 

现在看起来如何:

清脆的WPF图像http://img13.imageshack.us/img13/9926/crispwpfimages.gif

+1为Zack Peterson

我正在使用.net 3.5 SP1,它看起来像大量的模糊图像最简单的解决scheme。 指定RenderOptions并不重要,但对于第三方组件来说,应用程序级资源中的风格是有意义的:

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

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

在根窗口上使用UseLayoutRounding="True"在许多情况下工作,但在使用WPF Ribbon控件时遇到了问题。 我的应用程序依赖于根据用户正在做什么而出现的上下文选项卡,并且当我将UseLayoutRounding设置为True ,上下文选项卡不会显示,并且RibbonButton的图像也不会显示。 此外,应用程序冻结了很多秒,CPU风扇开始唱歌。

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

RenderOptions.BitmapScalingMode =“NearestNeighbor”在大多数情况下运行良好。 但是,偶尔会出现graphics故障(在我的情况下,5个图像中有4个显示正常,但是第五个图像右边有轻微的扭曲)。 我修正了我增加Image控件的右边距1。

如果仍然不能解决这个问题,试试EugeneZ提到的上面的Bitmap类控件。 它是Image控件的替代品,到目前为止它对我来说工作得非常好。 请参阅http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

确保将图像保存在WPF应用程序所在的DPI中,某些图像格式将此信息存储为元数据。 我不知道这是否解决了这个问题,但是我也遇到了一些问题,因为这里的图像大小调整到了100%,比预期的要大或者小。

可能是类似的东西。

我相信这是一个错误(至less是这样)。 看看这个Microsoft支持电子邮件交换页面的一些想法来解决它。

我发现RenderOptions.BitmapScalingMode =“NearestNeighbor”不适合我。 我使用Windows XP x32和DirectX 9.0c。 由于WPF的实际渲染是通过DirectX完成的,所以这可能会产生影响。 我使用以下registry项为XP打开了反锯齿function:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Avalon.Graphics]“MaxMultisampleType”= dword:00000004“EnableDebugControl”= dword:00000001

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

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

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

我发现的工作:

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

使用UseLayoutRounding = True来应用程序中最顶层的元素

我首先想到的是,阅读这个问题的时候,你是在夸大这个形象,但是看起来并不是这样的。

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

如果你能完全排除上述两点,我目前就难倒了。

作为一个实验,你可以尝试其他graphics格式,但PNG应该没问题。 我将不得不考虑通过一些更好的答案。

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

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

这减less了PNG的头部,并且还减小了尺寸,但是没有改变图像质量。

现在我所有的图像都是完美的! 🙂