【问题标题】:WPF Blurry ImagesWPF 模糊图像
【发布时间】: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 显示器上看起来很模糊?我不知道是什么原因造成的,希望有人能解决这个问题。

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

  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/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
  4. 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


【解决方案1】:

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

重采样的主题非常深入;请参阅Old Pro's answer to a question on downscaling quality 中的链接,尤其是this one

【讨论】:

  • 感谢分享链接!似乎这正是我的问题。不幸的是,除了等待 Microsoft 修复该行为之外,我无能为力。
【解决方案2】:

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

create-vector-from-image

convert-svg-to-xaml

【讨论】:

  • 对不起Russell,但我不认为我必须有矢量图标。正如您在我帖子中的图片中看到的那样,这些图片看起来既漂亮又清晰!
  • 当以设计的分辨率渲染时,它们看起来确实不错。尝试将一张图像转换为矢量,看看效果如何。希望它对你有用。
  • 它们在低于设计目标的分辨率下看起来也很清晰(这是我的情况)。我知道矢量图形会起作用,但我不想将所有图像都转换为矢量图形(> 200 个图像)。必须有一种方法来显示图像,就像在 WindowsForms 中一样。
  • 不是理想的解决方案,但必须尝试在 xaml 中使用缩放变换?
  • 所以我尝试将图像的大小设置为位图的大小 (96x96) 并应用 1/3 的比例变换。不幸的是,结果看起来像我帖子中图像中的线性缩放模式:(但值得一试!
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 2011-08-04
  • 2018-12-26
  • 1970-01-01
  • 2015-06-10
  • 2021-03-17
  • 2015-09-19
  • 2019-02-02
相关资源
最近更新 更多