2013-01-04 69 views
7

Làm cách nào để chuyển đổi đối tượng WriteableBitmap thành đối tượng BitmapImage trong WPF?Làm cách nào để chuyển đổi đối tượng WriteableBitmap sang đối tượng BitmapImage trong WPF

This link bao gồm Silverlight, quá trình này không giống nhau trong WPF vì đối tượng WriteableBitmap không có phương thức SaveJpeg.

Vì vậy, câu hỏi của tôi là Làm cách nào để chuyển đổi đối tượng WriteableBitmap thành đối tượng BitmapImage trong WPF?

+1

Xem [câu trả lời này] (http: //stackoverflow.com/a/13988871/1136211) và thay thế RenderTargetBitmap bởi Wri teableBitmap. Tại sao chính xác bạn cần chuyển đổi này? Nó thường không cần thiết, vì BitmapImage và WriteableBitmap có một lớp cơ sở chung BitmapSource cung cấp tất cả các thuộc tính có liên quan của một hình ảnh. – Clemens

Trả lời

11

Bạn có thể sử dụng một trong những BitmapEncoders để lưu WriteableBitmap khung để một mới BitmapImage

Trong ví dụ này, chúng ta sẽ sử dụng PngBitmapEncoder nhưng chỉ cần chọn một trong đó phù hợp với tình hình của bạn.

public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm) 
{ 
    BitmapImage bmImage = new BitmapImage(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     PngBitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(wbm)); 
     encoder.Save(stream); 
     bmImage.BeginInit(); 
     bmImage.CacheOption = BitmapCacheOption.OnLoad; 
     bmImage.StreamSource = stream; 
     bmImage.EndInit(); 
     bmImage.Freeze(); 
    } 
    return bmImage; 
} 

sử dụng:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

hoặc bạn có thể làm cho điều này là một phương pháp mở rộng cho việc sử dụng dễ dàng

public static class ImageHelpers 
{ 
    public static BitmapImage ToBitmapImage(this WriteableBitmap wbm) 
    { 
     BitmapImage bmImage = new BitmapImage(); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      PngBitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(wbm)); 
      encoder.Save(stream); 
      bmImage.BeginInit(); 
      bmImage.CacheOption = BitmapCacheOption.OnLoad; 
      bmImage.StreamSource = stream; 
      bmImage.EndInit(); 
      bmImage.Freeze(); 
     } 
     return bmImage; 
    } 
} 

sử dụng:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

Và đừng quên tua lại luồng. Sau khi lưu, trước khi thiết lập 'bmImage.StreamSource' làm một' stream.Seek (0, SeekOrigin.Begin); '. Một số bộ giải mã (ví dụ: JPG) yêu cầu điều này. Xem thêm [ở đây] (http://stackoverflow.com/a/13988871/1136211). – Clemens

+0

Thankyou cả hai, hữu ích nhất! – JMK

+0

@JMK Tôi vẫn nghi ngờ rằng nó thực sự cần thiết để thực hiện chuyển đổi này. – Clemens

Các vấn đề liên quan