2013-01-04 13 views
7

Jak przekonwertować obiekt WriteableBitmap na obiekt BitmapImage w WPF?Jak przekonwertować obiekt WriteableBitmap na obiekt BitmapImage w WPF

This link obejmuje silverlight, proces nie jest taki sam w WPF, ponieważ obiekt WriteableBitmap nie ma metody SaveJpeg.

Moje pytanie brzmi: Jak przekonwertować obiekt WriteableBitmap na obiekt BitmapImage w WPF?

+1

See [ta odpowiedź] (http: //stackoverflow.com/a/13988871/1136211) i zastąpienie RenderTargetBitmap przez Wri teableBitmap. Dlaczego dokładnie potrzebujesz tej konwersji? Zwykle nie jest to konieczne, ponieważ BitmapImage i WriteableBitmap mają wspólną klasę bazową BitmapSource, która zapewnia wszystkie odpowiednie właściwości obrazu. – Clemens

Odpowiedz

11

Można użyć jednego z BitmapEncoders zapisać ramkę WriteableBitmap do nowego BitmapImage

W tym przykładzie użyjemy PngBitmapEncoder ale tylko wybrać ten, który pasuje do Twojej sytuacji.

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

Wykorzystanie:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

czy można zrobić to metoda rozszerzenie dla łatwego użycia

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

Wykorzystanie:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

I nie zapomnij przewinąć strumienia. Po zapisaniu, przed ustawieniem 'bmImage.StreamSource' wykonaj' stream.Seek (0, SeekOrigin.Begin); '. Niektóre dekodery (na przykład JPG) wymagają tego. Zobacz także [tutaj] (http://stackoverflow.com/a/13988871/1136211). – Clemens

+0

Dziękuję wszystkim, bardzo pomocni! – JMK

+0

@JMK Nadal wątpię, że to naprawdę konieczne, aby wykonać tę konwersję. – Clemens

Powiązane problemy