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

问题描述 投票:159回答:12

我在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"线不能阻止这个问题呢?

.net wpf image xaml
12个回答
222
投票

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

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

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

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


2
投票

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

我发现了什么工作:

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

0
投票

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

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

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

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


0
投票

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

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

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

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


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


22
投票

给扎克彼得森+1

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

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

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


8
投票

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

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


5
投票

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

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


4
投票

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

可能是类似的东西。


4
投票

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


2
投票

我相信这是一个错误(或至少它是)。看看这个Microsoft support e-mail exchange页面上的一些想法来解决它。


2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.