WPF模糊图像

时间:2014-04-28 07:11:34

标签: c# wpf image bitmap blurry

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

google中有很多内容可供查找,甚至在stackoverflow上也有一些关于此问题的主题。 总结他们说:启用属性UseLayoutRounding并将RenderOptions.BitmapScalingMode设置为HighQuality。不幸的是,这对我来说并不适用 - 图像看起来仍然非常模糊。 然后我在具有更高DPI aaaand-WOW的笔记本电脑上测试了我的应用程序。图像非常清晰。

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

Example on low-DPI display (96dpi) Example on high-DPI display (~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/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
  4. Disabling antialiasing on a WPF image
  5. 修改

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

2 个答案:

答案 0 :(得分:3)

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

create-vector-from-image

convert-svg-to-xaml

答案 1 :(得分:0)

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

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