【发布时间】:2014-06-13 14:55:52
【问题描述】:
我正在寻找一种方法来防止 WPF 模糊我的图像。我希望我的应用程序在高 DPI 显示器上看起来不错,所以我创建了 96x96px 的图标以显示为 32x32 大小。
在 google 中可以找到很多内容,甚至在 stackoverflow 上也有一些关于此的主题。
他们总结说:启用属性UseLayoutRounding 并将RenderOptions.BitmapScalingMode 设置为HighQuality。不幸的是,这对我来说真的不起作用——图像看起来仍然很模糊。
然后我在具有更高 DPI aaaand 的笔记本电脑上测试了我的应用程序 - 哇。图像非常清晰漂亮。
我唯一的解决方案是创建一个自定义控件,将 ImageSource 转换为 System.Drawing.Bitmap,在此处重新缩放以匹配图像尺寸并将其转换回 WPF ImageSource。显然不是完美的解决方案!
所以问题是:为什么我的图像在低 dpi 显示器上看起来很模糊?我不知道是什么原因造成的,希望有人能解决这个问题。
这里是我发现的一些最有用的资源:
- http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
- http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx
- http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
- Disabling antialiasing on a WPF image
编辑:
这里要求的是转换 ImageSource 的代码。有几个方法调用不包括在内,但您可以通过 google 快速找到它们。
// Calculate the conversion factor.
float dpi = WpfImageHelper.GetCurrentDPI(this);
float factor = dpi / 96f;
int width = (int)Math.Round(this.image.ActualWidth * factor);
int height = (int)Math.Round(this.image.ActualHeight * factor);
// Create bitmaps.
Bitmap oldBitmap = WpfImageHelper.ToWinFormsBitmap2((BitmapSource)this.Source);
Bitmap newBitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Draw the new bitmap. Use high-quality interpolation mode.
using (Graphics g = Graphics.FromImage(newBitmap))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.Clear(System.Drawing.Color.Transparent);
g.DrawImage(oldBitmap, 0, 0, newBitmap.Width, newBitmap.Height);
}
// Set the image source to the resized bitmap.
this.Source = WpfImageHelper.ToWpfBitmap2(newBitmap);
【问题讨论】:
-
这是一个很好的问题!我自己也遇到过类似的问题。我的特别与 Windows 8 相关。
-
感谢您的提示。我在win7-PC上试了一下,结果和win8一样。
-
您是否尝试将这些转换为矢量图像?
-
是的,我有这个想法,但不想为此付出努力。如果没有办法很好地显示图像,那么我想我会在桌子上撞到我的头;)
-
@freakinpenguin:也许我要求的太多了,但是拥有您的转换代码可能对其他人有用。如果没有其他解决方案出现,也许您想发布您的解决方案作为答案?
标签: c# wpf image bitmap blurry