2014-04-28 34 views
12

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!

Example on low-DPI display (96dpi) Example on high-DPI display (~122dpi)

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:

  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

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); 
+1

Đó 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. –

+0

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. –

+0

Bạn đã thử chuyển đổi chúng thành hình ảnh vector chưa? – MoonKnight

Trả lời

3

Biểu tượng của bạn là bitmap để bạn không giải quyết vấn đề này IMHO. Bạn cần phải xem xét một giải pháp khác. Bạn muốn các biểu tượng của mình trở thành thiết bị độc lập, do đó bạn cần phải chuyển đổi hình ảnh thành vectơ hoặc chuyển đổi hình ảnh thành xaml. Câu hỏi này đã được hỏi và trả lời trước đó và giải pháp không liên quan đến nhiều nỗ lực.

create-vector-from-image

convert-svg-to-xaml

+0

Xin lỗi Russell, nhưng tôi không nghĩ rằng tôi phải có biểu tượng vector. Như bạn có thể thấy trong các hình ảnh trong bài viết của tôi những hình ảnh có thể trông đẹp & sắc nét! –

+0

Chúng trông đẹp khi được hiển thị ở độ phân giải được thiết kế cho. Hãy thử chuyển đổi một hình ảnh thành một véc tơ và xem nó như thế nào. Hy vọng nó hoạt động cho bạn. – RussellEast

+0

Chúng trông cũng sắc nét ở độ phân giải thấp hơn so với chúng được thiết kế cho (trường hợp của tôi). Tôi biết đồ họa vector sẽ hoạt động, nhưng tôi không muốn chuyển đổi tất cả hình ảnh thành đồ họa vector (> 200 hình ảnh). Có PHẢI là một cách để hiển thị hình ảnh giống như trong WindowsForms. –

0

Theo this post (từ tác giả đáng kính của VirtualDub), WPF của chất lượng cao "Fant" phương pháp là không thực sự là tuyệt vời. Điều khiển tùy chỉnh của bạn sử dụng phương pháp cao cấp bicubic.

Chủ thể lấy mẫu lại khá sâu; xem các liên kết trong Old Pro's answer to a question on downscaling quality, đặc biệt là this one.

+0

Cảm ơn bạn đã chia sẻ liên kết! Có vẻ như đây chính xác là vấn đề của tôi. hơn là chờ Microsoft sửa chữa hành vi. –