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

Zac*_*son 164 .net wpf xaml image

我在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" />
Run Code Online (Sandbox Code Playgroud)

但是,它们显得模糊:

死链接 - 模糊的WPF图像

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

死链接 - 模糊的WPF图像缩放

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

Dom*_*kun 228

您可能需要考虑尝试在WPF4中使用的新属性.离开RenderOptions.BitmapScalingMode高质量或者只是不申报.

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

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

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

  • **FINALLY !!**默认情况下应设置UseLayoutRounding.图像显示就像原始文件一样,甚至某些地方的文本(比如ContextMenus,至少对我来说)显示比以前更清晰.谢谢,Domokun! (22认同)
  • UseLayoutRendering ="True"是我使用的 - 这非常适合解决我模糊的图像.谢谢! (4认同)
  • 有关此新属性的更多信息,请访问:http://blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx (3认同)
  • 我想我们这些仍然坚持.NET 3.5的人没有选择权? (2认同)
  • 我发现如果我在图像上将属性 Stretch 设置为 None ,这可以解决我的问题,但在所有其他情况下,即使关闭了高质量图像渲染和锯齿,图像拉伸在 WPF 中仍然很糟糕。但是,至少这解决了非拉伸图像的问题(这本来不应该是一个问题) (2认同)

Zac*_*son 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" />
Run Code Online (Sandbox Code Playgroud)

现在看来它是这样的:

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

  • @Zack Width ="20"并不意味着20像素.这意味着20/96英寸.如果您的操作系统配置为以96 DPI运行,那么它是20像素.现在你最近的邻居将如何看待一台好的显示器,例如160 DPI?当你以300 DPI打印时它会是什么样子?您不应该针对您的开发机器进行优化. (8认同)
  • 我还发现,对于像素大小的图像,NearestNeighbor 比 HighQuality 好得多,尤其是当你将它与 img.Width = imgSource.PixelWidth; 结合使用时。img.Height = imgSource.PixelHeight。我的客户提供了一些具有不同疯狂 DPI 值的图像,我无法要求客户将它们全部转换,所以我不得不使用这个 hack。 (2认同)

DK.*_*DK. 22

给扎克彼得森+1

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

 <Style TargetType="{x:Type Image}">
    <Setter
        Property="RenderOptions.BitmapScalingMode"
        Value="NearestNeighbor" />
 </Style>
Run Code Online (Sandbox Code Playgroud)

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


Omi*_* B. 8

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

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


小智 6

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


小智 5

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

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


小智 5

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

可能是类似的东西。