我正在寻找一种方法来阻止WPF模糊我的图像。我希望我的应用程序在高DPI显示器上看起来很好,所以我创建了96x96px的图标,以32x32的大小显示。
google中有很多内容可供查找,甚至在stackoverflow上也有一些关于此问题的主题。
总结他们说:启用属性UseLayoutRounding
并将RenderOptions.BitmapScalingMode
设置为HighQuality
。不幸的是,这对我来说并不适用 - 图像看起来仍然非常模糊。
然后我在具有更高DPI aaaand-WOW的笔记本电脑上测试了我的应用程序。图像非常清晰。
我唯一的解决方案是创建一个自定义控件,将ImageSource转换为System.Drawing.Bitmap,将其重新缩放以匹配图像尺寸并将其转换回WPF ImageSource。显然不是完美的解决方案!
所以问题是:为什么在低dpi显示屏上看我的图像模糊?我不知道是什么导致了这一点,希望有人有想法解决这个问题。
这里有一些我发现的最有用的资源:
修改
这里要求的是转换ImageSource的代码。有一些方法调用没有包含在内,但你可以通过谷歌快速找到它们。
// 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);
答案 0 :(得分:3)
你的图标是位图,所以你不会解决这个问题恕我直言。您需要寻找不同的解决方案。您希望图标与设备无关,因此您需要将图像转换为矢量或将图像转换为xaml。之前已经提出并回答了这个问题,解决方案不需要太多努力。
答案 1 :(得分:0)
根据this post(来自受尊敬的VirtualDub创建者),WPF的高品质“幻想”方法并不是那么好。您的自定义控件使用优秀的双三次方法。
重新采样的主题非常深刻;请参阅Old Pro's answer to a question on downscaling quality中的链接,尤其是this one。