Tôi đang tìm cách ngăn WPF làm mờ hình ảnh của mình. Tôi muốn ứng dụng của tôi trông đẹp trên màn hình DPI cao nên tôi đã tạo Biểu tượng ở kích thước 96x96px để hiển thị ở kích thước 32x32.Hình ảnh mờ WPF
Có rất nhiều trong google để tìm và thậm chí trên stackoverflow có một số chủ đề về điều này. Tóm tắt họ nói: Bật thuộc tính UseLayoutRounding
và đặt RenderOptions.BitmapScalingMode
thành HighQuality
. Thật không may điều này không thực sự làm việc cho tôi - những hình ảnh vẫn trông rất mờ. Sau đó, tôi đã thử nghiệm ứng dụng của mình trên một máy tính xách tay có DPI cao hơn - WOW. Hình ảnh hoàn toàn sắc nét và đẹp mắt.
Giải pháp duy nhất của tôi là tạo một điều khiển tùy chỉnh chuyển đổi ImageSource thành System.Drawing.Bitmap, rescales nó ở đó để phù hợp với kích thước hình ảnh và chuyển nó trở lại một WPF ImageSource. Rõ ràng không phải là giải pháp hoàn hảo!
Vì vậy, câu hỏi là: Tại sao tìm kiếm hình ảnh của tôi mờ trên-dpi hiển thị thấp? Tôi không biết điều gì có thể gây ra điều này và hy vọng ai đó có ý tưởng để sửa lỗi này.
Dưới đây một số tài nguyên hữu ích nhất mà tôi tìm thấy:
- 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
- Disabling antialiasing on a WPF image
EDIT:
01.235.Như được yêu cầu ở đây là mã để chuyển đổi Nguồn hình ảnh. Có một vài cuộc gọi phương thức không được bao gồm nhưng bạn có thể tìm thấy chúng nhanh chóng qua 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);
Đó là một nỗ lực tốt cho một câu hỏi! Tôi cũng có những vấn đề tương tự. Mỏ đặc biệt liên quan đến Windows 8. –
Cảm ơn gợi ý. Tôi đã thử nó trên một win7-PC và có kết quả tương tự như trên win8. –
Bạn đã thử chuyển đổi chúng thành hình ảnh vector chưa? – MoonKnight