Conversión de BitmapImage en matriz de bytes

Quiero convertir un BitmapImage a ByteArray en una aplicación de Windows Phone 7. Así que probé esto pero arroja el tiempo de ejecución Excepción “Excepción del puntero no válido”. ¿Alguien puede explicar por qué lo que estoy tratando de hacer arroja una excepción? Y puede proporcionar una solución alternativa para esto.

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

Bueno, puedo hacer que el código sea considerablemente más simple:

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

… pero eso probablemente no resolverá el problema.

Otro problema es que solo utilizas el tamaño de bitmapImage , ¿no deberías copiarlo en btmMap en algún momento?

¿Hay alguna razón por la que no solo estés usando esto?

 WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

¿Puede darnos más información sobre dónde ocurre el error?

No estoy seguro de cuál es su problema, pero sé que el siguiente código es un cambio muy pequeño del código que sé que funciona (el mío estaba pasando en un bitmap de Writeable, no en un bitmap):

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

Tuve el mismo problema, esto lo resuelve:

Código antes:

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

Código después:

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