2013-01-04 19 views
7

bir BitmapImage nesne için bir WriteableBitmap nesnesi dönüştürebilirim?nasıl WPF bir <code>BitmapImage</code> nesne için bir <code>WriteableBitmap</code> nesneyi dönüştürmek nasıl WPF

This linkWriteableBitmap amacı SaveJpeg yöntem yoktur yöntem WPF aynı değildir, SILVERLIGHT kapsar.

Bu yüzden soruma bir WriteableBitmap nesnesini WPF içinde BitmapImage nesnesine nasıl dönüştürebilirim?

+1

bakınız [Bu cevap] (http: //stackoverflow.com/a/13988871/1136211) ve RenderTargetBitmap tarafından Wri'yi değiştirin teableBitmap. Bu dönüşüme neden tam olarak ihtiyacın var? BitmapImage ve WriteableBitmap bir resmin tüm ilgili özellikleri sağlayan ortak bir taban sınıfı BitmapSource var, çünkü genellikle gerekmez. – Clemens

cevap

11

Sence PngBitmapEncoder kullanmak ama sadece durumunuza uygun olanı seçecektir Bu örnekte yeni BitmapImage

için WriteableBitmap çerçeveyi kaydetmek için BitmapEncoders birini kullanabilirsiniz.

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

kullanımı:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

veya bu kolay kullanım için bir uzantısı yöntemi yapabiliriz

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

kullanımı:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

Ve akışı geri almayı unutma. '; Ayarlamadan önce, kaydettikten sonra' bmImage.StreamSource' bir 'stream.Seek (0, SeekOrigin.Begin) yapmak. Bazı kod çözücüler (ör., JPG) bunu gerektirir. Ayrıca bakınız [here] (http://stackoverflow.com/a/13988871/1136211). – Clemens

+0

Her ikisi de en yararlı! – JMK

+0

@JMK Yine ben bu dönüşümü yapmak gerçekten gerekli şüpheliyim. – Clemens