34

バイト配列をに変換し、画像コントロールにSystem.Windows.Media.Imaging.BitmapImage表示します。BitmapImage

最初のコードを使用しているとき、注意が必要です! エラーも画像も表示されません。しかし、2番目のものを使用しているときはうまくいきます! 誰が何が起こっていると言うことができますか?

最初のコードは次のとおりです。

public BitmapImage ToImage(byte[] array)
{
   using (System.IO.MemoryStream ms = new System.IO.MemoryStream(array))
   {
       BitmapImage image = new BitmapImage();
       image.BeginInit();
       image.StreamSource = ms;
       image.EndInit();
       return image;
   }
}

2番目のコードは次のとおりです。

public BitmapImage ToImage(byte[] array)
{
   BitmapImage image = new BitmapImage();
   image.BeginInit();
   image.StreamSource = new System.IO.MemoryStream(array);
   image.EndInit();
   return image;
 }
4

2 に答える 2

68

using最初のコード例では、イメージが実際にロードされる前に、(ブロックを離れることによって) ストリームが閉じられます。BitmapCacheOptions.OnLoadを設定して、イメージがすぐに読み込まれるようにする必要があります。そうしないと、2 番目の例のように、ストリームを開いたままにする必要があります。

public BitmapImage ToImage(byte[] array)
{
    using (var ms = new System.IO.MemoryStream(array))
    {
        var image = new BitmapImage();
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad; // here
        image.StreamSource = ms;
        image.EndInit();
        return image;
    }
}

BitmapImage.StreamSourceの備考セクションから:

BitmapImage の作成後にストリームを閉じる場合は、CacheOption プロパティを BitmapCacheOption.OnLoad に設定します。


それに加えて、組み込みの型変換を使用して、型byte[]から型ImageSource(または派生BitmapSource)に変換することもできます。

var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);

ImageSourceConverter は、型のプロパティImageSource(Image コントロールのプロパティなど) を型、またはSourceのソース プロパティにバインドすると、暗黙的に呼び出されます。stringUribyte[]

于 2013-01-15T11:57:29.040 に答える
4

MemoryStream最初のケースでは、ブロック内でを定義しましたusing。これにより、ブロックから出るときにオブジェクトが破棄されます。したがってBitmapImage、disposes(および存在しない)ストリームを含むを返します。

MemoryStream■管理されていないリソースを保持しないため、メモリを残してGCに解放プロセスを処理させることができます(ただし、これは適切な方法ではありません)。

于 2013-01-15T11:55:24.263 に答える