Я ищу способ предотвратить размытие изображений в WPF. Я хочу, чтобы мое приложение выглядело хорошо на дисплеях с высоким разрешением, поэтому я создал значки в 96x96px для отображения размером 32x32.
Там много в google, чтобы найти, и даже в stackoverflow есть несколько тем об этом.
Подводя итог, говорят: Включите свойство UseLayoutRounding
и установите RenderOptions.BitmapScalingMode
на HighQuality
. К сожалению, это не работает для меня - изображения все еще выглядят очень размытыми.
Затем я протестировал свое приложение на ноутбуке с более высоким DPI aaaand - WOW. Изображения полностью острые и приятные.
Моим единственным решением было создание настраиваемого элемента управления, который преобразует ImageSource в System.Drawing.Bitmap, перетаскивает его там, чтобы соответствовать размеру изображения и преобразовывать его обратно в WPF ImageSource. Очевидно, это не идеальное решение!
Итак, встает вопрос: почему мои изображения размыты на дисплее с низким разрешением? Я не знаю, что может вызвать это, и надеюсь, что у кого-то есть идея исправить это.
Вот некоторые из наиболее полезных ресурсов, которые я нашел:
- 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
- Отключение сглаживания изображения WPF
EDIT:
В соответствии с запрошенным здесь кодом для преобразования 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);