WPF中的图像变得模糊
我正在使用C#开发WPF中的应用程序。 我把图片放在一个WrapPanel中,并在一个Grid中显示一个边框,并在Button中使用图片。 问题是我的图像控制失去其质量。 我不能在这里发表我的形象,所以我只是在这里描述。
我使用SnapsToDevicePixels="True"
作为图像,但仍然看起来很模糊。
更新:
在这里我分享了下面的图片:
我想马库斯告诉你的是解决你的问题的一种方法,并尝试在其中添加一个属性RenderOptions.EdgeMode="Aliased"
我的意思是:
<Image Source="/LoginPanel;component/Icons/icoLogin.ico" RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased"/>
如果你仍然无法解决你的问题,那么你可以参考这个http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx来创build一个自定义的位图类,并申请所有的图像都在为你制造麻烦。;
你也可以看到这个堆栈溢出问题
SnapsToDevicePixels似乎不适用于位图。
NearestNeighbor选项实际上将转换位图,并将最终与原始位图不同。
在WPF 4中,引入了FrameworkElement上的一个属性“ UseLayoutRounding ”来解决这个问题。
通过在根元素上将此属性设置为True,例如Window将在子像素的边缘上alignment子元素。
<Window UseLayoutRounding="True">...</Window>
这对我有用
<Image Source="/LoginPanel;component/Icons/icoLogin.ico" RenderOptions.BitmapScalingMode="NearestNeighbor"</Image>
为每个图像设置RenderOptions.BitmapScalingMode =“NearestNeighbor”。 或者在StackOverflow上看到这个问题 。
编辑:
这是我的示例代码
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="661"> <WrapPanel> <Button VerticalAlignment="Center"> <Image Source="/WpfApplication1;component/icoChip32x32.ico" RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image> </Button> <Button VerticalAlignment="Center"> <Image Source="/WpfApplication1;component/icoChip32x32.ico" RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image> </Button> <Button VerticalAlignment="Center"> <Image Source="/WpfApplication1;component/Presentation-Edit.png" RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image> </Button> <Button VerticalAlignment="Center"> <Image Source="/WpfApplication1;component/Presentation-Edit.png" RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image> </Button> </WrapPanel> </Window>
这是我的结果:
如果图像用作内容,请在父元素上使用UseLayoutRounding =“True”属性。 在你的情况下,它是button。
我遇到了由缩放导致的图像背景的模糊问题,解决scheme比您想像的要简单得多。 虽然起初我想知道它是否被放大到了2的幂的纹理尺寸,缩放实际上与系统DPI(96):Image DPI(72,这是许多编辑器的默认设置)的比例相匹配。 如果将图像调整为96 DPI,则应使用默认的Windows设置显示像素完美。
编辑:试图与高细节对比度的图像,它稍微软化。
我有同样的问题,但在我的情况下,我已经下载图标,发现他们都有错误的新闻部太… 110,56和116,XX和95,99等…
当我将DPI更改为96时,一切都很好!
WPF不使用具体的像素值进行大小和定位,以便DPI可以很好地扩展。
这可能会导致一个问题,即它试图使用一个不对应于离散的屏幕像素的位置; 一些图像像素被渲染成多个屏幕上的像素,我们看到的是模糊。
UseLayoutRendering = true与SnapToDevicePixels = false应该解决这个问题。 您还需要将其设置在主窗口级别,以便计算级联到图像级别。
你可以通过一个窗口创build一个简单的WPF应用程序和你的图像来试试。 将图像边距设置为(10.452,0.736,0,0)这样的愚蠢将会导致模糊。 这在图像上使用UseLayoutRendering = true消失。
如果您在InitializeComponent()之后再次在窗口的构造函数中设置边距,则无论您在图像上是否设置了UseLayoutRendering = true,都会模糊不清,因为在移动图像之前已经完成了与屏幕像素alignment的计算到与这些不匹配的位置。
我不完全确定UseLayoutRendering和SnapToDevicePixels有什么区别 – 我想这只是计算的时间。 UseLayoutRendering似乎是更好的图像。
从原始尺寸拉伸/挤压图像也会导致模糊问题。