12

我正在寻找一种方法来防止 WPF 模糊我的图像。我希望我的应用程序在高 DPI 显示器上看起来不错,所以我创建了 96x96px 的图标以显示为 32x32 大小。

在 google 中有很多东西可以找到,甚至在 stackoverflow 上也有一些关于此的主题。总结他们说:启用该属性UseLayoutRounding并设置RenderOptions.BitmapScalingModeHighQuality. 不幸的是,这对我来说真的不起作用——图像看起来仍然很模糊。然后我在具有更高 DPI aaaand 的笔记本电脑上测试了我的应用程序 - 哇。图像非常清晰漂亮。

我唯一的解决方案是创建一个自定义控件,将 ImageSource 转换为 System.Drawing.Bitmap,在此处重新缩放以匹配图像尺寸并将其转换回 WPF ImageSource。显然不是完美的解决方案!

低 DPI 显示 (96dpi) 示例 高 DPI 显示器示例 (~122dpi)

所以问题是:为什么我的图像在低 dpi 显示器上看起来很模糊?我不知道是什么原因造成的,希望有人有办法解决这个问题。

这是我发现的一些最有用的资源:

  1. http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
  2. http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx
  3. http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWe​​irdOrAreBlurry.aspx
  4. 在 WPF 图像上禁用抗锯齿

编辑:

这里要求的是转换 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); 
4

2 回答 2

3

您的图标是位图,因此恕我直言,您不会解决此问题。您需要寻找不同的解决方案。您希望您的图标与设备无关,因此您需要将图像转换为矢量或将图像转换为 xaml。这个问题之前已经被问过和回答过,解决方案并不需要太多努力。

从图像创建矢量

将 svg 转换为 xaml

于 2014-04-28T10:23:11.717 回答
0

根据这篇文章(来自受人尊敬的 VirtualDub 的创建者),WPF 的高质量“fant”方法并不是那么好。您的自定义控件使用高级双三次方法。

重采样的主题非常深入。请参阅Old Pro 对缩小质量问题的回答中的链接,尤其是这个

于 2015-07-16T03:50:03.983 回答