Преобразование массива BitmapImage в байт

Я хочу преобразовать BitmapImage в ByteArray в приложении Windows Phone 7. Поэтому я попробовал это, но он выдает исключение Execution Execution Execution Execution Exception. Может ли кто-нибудь объяснить, почему то, что я пытаюсь сделать, выдает исключение. И можете ли вы предоставить альтернативное решение для этого.

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

Ответы

Ответ 1

Ну, я могу сделать код у вас значительно проще:

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

... но это, вероятно, не решит проблему.

Другая проблема заключается в том, что вы когда-либо используете размер bitmapImage - не следует ли копировать это на btmMap в какой-то момент?

Есть ли причина, по которой вы не просто используете это:

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);

Можете ли вы дать нам больше информации о том, где происходит ошибка?

Ответ 2

Я не уверен, в чем проблема, но я знаю, что следующий код - это очень незначительное изменение кода, который, как я знаю, работает (мой был передан в WriteableBitmap, а не в BitmapImage ):

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

Ответ 3

У меня была такая же проблема, это решает:

Код до:

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