2011-01-19 17 views
13

Quiero convertir una imagen de mapa de bits 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.Conversión de BitmapImage en matriz de bytes

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

Respuesta

17

Bueno, yo puedo hacer que el código que tienes mucho más sencillo:

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 que probablemente no va a resolver el problema.

Otra cuestión es que cada vez que estés usando solamente el tamaño de bitmapImage - ¿no deberías estar copiando a que btmMap en algún momento?

¿Hay alguna razón que no sólo está usando esto:

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

¿Nos puede dar más información acerca de dónde se produce el error?

+0

En realidad, he utilizado lo anterior, WriteableBitmap btmMap = new WriteableBitmap (BitmapImage); Previamente, he mostrado algo incorrecto. pero Still muestra el mismo error "Puntero inválido". – dinesh

+2

Cuando trato de utilizar su método, termino obteniendo una imagen en negro a menos que inicialice btmMap en un mapa de bits con la imagen de mapa de bits en el constructor. No estoy seguro de si me falta algún tipo de configuración, pero pensé que podría mencionarlo. –

+0

¿podría sugerir una forma de hacerlo en Windows 8 RT? – Mayank

7

No estoy seguro exactamente cuál es su problema, pero sé que el código siguiente es un cambio menorde código que sé que funciona (la mía estaba pasando en un WriteableBitmap, no un 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; 
}
+0

He creado bitmapImage usando URI, ¿esto me está creando un problema? – dinesh

+0

No vi por qué no debería; a menos que no espere hasta que la imagen se haya descargado antes de intentar obtener el byte [] de ella. –

+1

Ahora que tengo la solución, el problema es que no se puede crear el objeto WritableBitmap porque el objeto BitmapImage se crea utilizando URI que es relativo. por lo tanto, no obtiene la imagen real. así que cambié el código: Insistido en este WriteableBitmap wBitmap = new WriteableBitmap (bitmapImage); Tenemos que hacer lo siguiente ... Image image = new Image(); image.SetSource (bitmapImage); WriteableBitmap wBitmap = new WriteableBitmap (imagen, nulo); Ahora puedo crear el objeto WritableBitmap – dinesh

1

había mismo problema, esto lo soluciona:

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