2013-01-04 3 views
7

Как преобразовать объект WriteableBitmap в объект BitmapImage в WPF?Как преобразовать объект WriteableBitmap в объект BitmapImage в WPF

This link Обложки silverlight, процесс не тот же в WPF, что и объект WriteableBitmap не имеет метода SaveJpeg.

Так что мой вопрос: Как преобразовать объект WriteableBitmap в объект BitmapImage в WPF?

+1

См [этот ответ] (HTTP: //stackoverflow.com/a/13988871/1136211) и заменить RenderTargetBitmap на Wri teableBitmap. Почему именно вам нужно преобразование? Это обычно не требуется, поскольку BitmapImage и WriteableBitmap имеют общий базовый класс BitmapSource, который предоставляет все соответствующие свойства изображения. – Clemens

ответ

11

Вы можете использовать один из BitmapEncoders сохранить WriteableBitmap рамку на новый BitmapImage

В этом примере мы будем использовать PngBitmapEncoder но только выбрать тот, который соответствует вашей ситуации.

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; 
} 

использование:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

или вы могли бы сделать этот метод расширения для удобного использования

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; 
    } 
} 

использование:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

И не забудьте перемотать поток. После сохранения перед установкой 'bmImage.StreamSource' выполните' stream.Seek (0, SeekOrigin.Begin); '. Некоторые декодеры (например, JPG) требуют этого. См. Также [здесь] (http://stackoverflow.com/a/13988871/1136211). – Clemens

+0

Thankyou обе, самый полезный! – JMK

+0

@JMK Тем не менее я сомневаюсь, что это действительно необходимо для этого преобразования. – Clemens