2

私は問題があります。配列に変換BitmapImageして元に戻したい。byte[]

私はこれらのメソッドを書きました:

public static byte[] ToByteArray(this BitmapImage bitmapImage)
{
    byte[] bytes;
    using (MemoryStream ms = new MemoryStream())
    {
        bitmapImage.BeginInit();
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.StreamSource.CopyTo(ms);
        bitmapImage.EndInit();
        bytes = ms.ToArray();
    }
    return bytes;
}

public static BitmapImage ToBitmapImage(this byte[] bytes, int width, int height)
{
    BitmapImage bitmapImage = new BitmapImage();
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        ms.Position = 0;
        bitmapImage.BeginInit();
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.StreamSource = ms;
        bitmapImage.EndInit(); // HERE'S AN EXCEPTION!!!
    }
    return bitmapImage;
}

最初のものは正常に動作しますが、からに変換しようとするとbyte[]...BitmapImageなぜNotSupportedExceptionですか? 2番目の方法のコードを修正するには?

4

1 に答える 1

5

あなたのToByteArray方法には2つの問題があります。

最初に、すでに初期化されている BitmapImage インスタンスに対してBeginInitandを呼び出します。EndInitこれは許可されていません。 BeginInitの例外リストを参照してください。

次に、Stream ではなく Uri から作成された BitmapImage でメソッドを呼び出すことができませんでした。その場合、StreamSourceプロパティは になりますnull

以下に示すような方法を実装することをお勧めします。この実装は、BitmapImages だけでなく、任意の BitmapSource で機能します。の代わりに適切なBitmapEncoderを選択することで、画像フォーマットを制御することもできます。JpegBitmapEncoderPngBitmapEncoder

public static byte[] ToByteArray(this BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder(); // or any other encoder
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var ms = new MemoryStream())
    {
        encoder.Save(ms);
        return ms.ToArray();
    }
}

このToByteArrayメソッドによって返されるイメージ バッファーは、メソッドによって常に BitmapImage に戻すことができますToBitmapImage

ToBitmapImageまた、メソッドの幅と高さの引数は現在使用されていないことに注意してください。


アップデート

デコード メソッドの別の実装は、以下に示すようになりますが、BitmapImage を返さず、基本クラス BitmapSource のインスタンスのみを返します。ただし、戻り値の型をBitmapFrameに変更することはできます。

public static BitmapSource ToBitmapImage(this byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        return decoder.Frames[0];
    }
}
于 2013-01-13T10:18:23.793 に答える