2009-02-26 92 views
155

我在我的WPF应用中使用了一些图片。我的图像模糊!为什么不是WPF的SnapsToDevicePixels工作?

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" /> 

但是,他们出现模糊:

Dead link - Blurry WPF Images

这里的一个放大的,侧由侧比较。一个原来是左边:

Dead link - Blurry WPF Image Zoomed

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

+3

您的图片链接似乎已经打破。如果你仍然有原始图像,请重新上传到stack.imgur。谢谢。 – 2015-07-27 08:42:43

+0

http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx – ezolotko 2009-02-27 02:34:14

+0

如果下面的提示都没有立即生效,请尝试将图片大小改为4倍在宽度和高度。因此,我认为您提供了一些合理的建议,只是试图提供帮助,最重要的是您的建议没有任何不正确之处,所以请不要使用179 X 44,请尝试176 X 44. – 2017-08-29 20:44:02

回答

199

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

最近的邻居为我工作,除了在放大应用程序时导致锯齿形位图。它似乎也没有解决图标以怪异方式进行大小调整的任何问题。

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

以前仅在Silverlight中提供的属性现在已修复所有位图大小的问题。 :)

0

我首先想到的是,阅读这个问题,你是在过度地炸毁图像,但是看起来你并没有看到应用程序的图像。

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

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

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

+0

+1以抵御无根据的否定投票。 – jpierson 2012-06-22 21:26:49

69

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

+0

此外,如果您的图像是标签中指定的确切尺寸,那么它不必缩放它,并且应该使它变得清晰。 – Bearddo 2009-02-26 21:42:57

+0

我不确定这会在不同的DPI – Dave 2009-02-27 03:20:07

5

RenderOptions.BitmapScalingMode = “最近邻” 行之有效的大部分时间。但是,偶尔会出现图形故障(在我的情况下,5个图像中有4个显示正常,但第五个图像右边有轻微变形)。我解决了它的问题,我将Image控件的右边距增加了1.

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

4

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

可能是类似的东西。

22

+1扎克·彼得森

我使用的.Net 3.5 SP1,它看起来像一个大数量的模糊图像的最简单的解决方案。 这不是什么大不了的指定就地RenderOptions,但对第三方组件的应用程序级资源的样式是有道理的:

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

很好地工作时,AvalonDock开始呈现模糊的图标。

2

我发现RenderOptions.BitmapScalingMode =“NearestNeighbor”对我不起作用。我正在使用带有DirectX 9.0c的Windows XP x32。由于WPF的实际渲染是通过DirectX完成的,所以这可能会产生影响。我有抗锯齿开启XP与下面的注册表项:

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

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

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

7

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

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

2

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

我已经找到了工作:

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

我试图使用RenderOptions.BitmapScalingMode =高质量,好像就是导致Windows 8.1的一些问题,所以我所做的就是通过所谓的PngOut.exe

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

工具来运行它们

这减少了png的头部,并且也减小了尺寸,但是没有改变图像质量。

现在我所有的图像都是完美的! :-)

2

使用UseLayoutRounding =真到最高元素在你的应用程序