2013-01-04 26 views
7

WriteableBitmapオブジェクトをBitmapImageオブジェクト(WPF)に変換するにはどうすればよいですか?WPFのWriteableBitmapオブジェクトをBitmapImageオブジェクトに変換するには

This linkはSilverlightをカバーしますが、WriteableBitmapオブジェクトにはSaveJpegメソッドがないため、プロセスがWPFでは同じではありません。

私の質問はWriteableBitmapオブジェクトをWPFのBitmapImageオブジェクトに変換するにはどうすればよいですか?

+1

参照[この回答](HTTP: //stackoverflow.com/a/13988871/1136211)、RenderTargetBitmapをWriで置き換えますteableBitmap。なぜこの変換が必要ですか? BitmapImageとWriteableBitmapには画像の関連するすべてのプロパティを提供する共通の基本クラスBitmapSourceがあるので、通常は必要ありません。 – Clemens

答えて

11

あなたは私たちがPngBitmapEncoderを使用しますが、自分の状況に合ったものを選択します。この例では新しいBitmapImage

WriteableBitmapフレームを保存するためにBitmapEncodersのいずれかを使用することができます。

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

両方とも、ありがとうございました! – JMK

+0

@JMKまだこの変換を行うことが本当に必要なのか疑問です。 – Clemens

関連する問題