web-dev-qa-db-ja.com

BitmapImageのバイト配列への変換

Windows Phone7アプリケーションでBitmapImageをByteArrayに変換したいと思います。だから私はこれを試しましたが、ランタイム例外「無効なポインタ例外」がスローされます。私がやろうとしていることが例外をスローする理由を誰かが説明できますか?そして、これに対する代替ソリューションを提供できますか。

    public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
    {
        byte[] data;
        // Get an Image Stream
        using (MemoryStream ms = new MemoryStream())
        {
            WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);

            // write an image into the stream
            Extensions.SaveJpeg(btmMap, ms,
                bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);

            // reset the stream pointer to the beginning
            ms.Seek(0, 0);
            //read the stream into a byte array
            data = new byte[ms.Length];
            ms.Read(data, 0, data.Length);
        }
        //data now holds the bytes of the image
        return data;
    }
13
dinesh

さて、私はあなたが持っているコードをかなり単純にすることができます:

public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmap btmMap = new WriteableBitmap
            (bitmapImage.PixelWidth, bitmapImage.PixelHeight);

        // write an image into the stream
        Extensions.SaveJpeg(btmMap, ms,
            bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);

        return ms.ToArray();
    }
}

...しかし、それではおそらく問題は解決しません。

もう1つの問題は、bitmapImageの-​​sizeのみを使用していることです。ある時点でそれをbtmMapにコピーするべきではありませんか?

これを使用しているだけではない理由はありますか?

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);

エラーが発生した場所について詳しく教えてください。

17
Jon Skeet

あなたの問題が正確に何であるかはわかりませんが、次のコードは非常に動作することがわかっているコードからのマイナーな変更です(私はBitmapImageではなくWriteableBitmapを渡していました):

public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
    byte[] data = null;
    using (MemoryStream stream = new MemoryStream())
    {
        WriteableBitmap wBitmap = new WriteableBitmap(bitmapImage);
        wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
        stream.Seek(0, SeekOrigin.Begin);
        data = stream.GetBuffer();
    }

    return data;
}
7
Derek Lakin

私は同じ問題を抱えていました、これはそれを解決します:

前のコード:

BitmapImage bi = new BitmapImage();
bi.SetSource(e.ChosenPhoto);
WriteableBitmap wb = new WriteableBitmap(bi);

後のコード:

BitmapImage bi = new BitmapImage();
bi.CreateOptions = BitmapCreateOptions.None;
bi.SetSource(e.ChosenPhoto);
WriteableBitmap wb = new WriteableBitmap(bi);
1
kober