2013-01-04 23 views
7

Come si converte un oggetto WriteableBitmap in un oggetto BitmapImage in WPF?Come convertire un oggetto WriteableBitmap in un oggetto BitmapImage in WPF

This link copre silverlight, il processo non è lo stesso in WPF poiché l'oggetto WriteableBitmap non ha un metodo SaveJpeg.

Quindi la mia domanda è Come convertire un oggetto WriteableBitmap in un oggetto BitmapImage in WPF?

+1

Sede [questa risposta] (http: //stackoverflow.com/a/13988871/1136211) e sostituisci RenderTargetBitmap di Wri teableBitmap. Perché hai esattamente bisogno di questa conversione? Di solito non è necessario, poiché BitmapImage e WriteableBitmap hanno una classe base comune BitmapSource che fornisce tutte le proprietà rilevanti di un'immagine. – Clemens

risposta

11

È possibile utilizzare uno dei BitmapEncoders per salvare il fotogramma WriteableBitmap ad un nuovo BitmapImage

In questo esempio useremo il PngBitmapEncoder ma solo scegliere quello che si adatta alla situazione.

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

utilizzo:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

o si potrebbe rendere questo un metodo di estensione per un facile utilizzo

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

utilizzo:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

E non dimenticare di riavvolgere il flusso. Dopo aver salvato, prima di impostare 'bmImage.StreamSource' fai un' stream.Seek (0, SeekOrigin.Begin); '. Alcuni decodificatori (ad esempio JPG) richiedono questo. Vedi anche [qui] (http://stackoverflow.com/a/13988871/1136211). – Clemens

+0

Grazie a tutti e due, molto utile! – JMK

+0

@ JMK Dubito ancora che sia davvero necessario fare questa conversione. – Clemens