Pregunta

Tengo un montón de imágenes almacenadas en la base de datos de mi servidor como matrices de bytes que me gustaría consumir en mi aplicación Android.

Las matrices de bytes se crearon a partir de imágenes en una aplicación de Windows Phone 7, por lo que utilizando el WriteableBitMap (WBMP) de .NET para guardar en un Aislado StorageFilEstream (ISFS):

     wbmp.SaveJpeg(isfs, newWidth, newHeight, 0, 90);

En la aplicación de Android, tengo un widget ImageView que estoy tratando de usar para mostrar una de las imágenes. He intentado usar BitMapFactory para decodificar la matriz de bytes (carga útil):

    Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
    img1.setImageBitmap(bmp); 

Pero eso no funciona: ninguna imagen de imagen y BMP es nulo cuando paso a través del depurador. Esto parece indicar que BitmapFactory no pudo decodificar correctamente la matriz de bytes.

Para Windows Phone 7, solo cargo el byte [] (realidad) en un MemoryStream (MStream), luego llamo al método SetSource del mapa de bits (BMP) con ese MemoryStream:

    mstream = new MemoryStream(reality);
    bmp.SetSource(mstream);

Entonces, en Android, intenté leer la matriz de bytes en un archivo de memoria y luego cargar el InputStream de MemoryFile usando bitmapFactory:

    MemoryFile mf;
        try {
            mf = new MemoryFile("myFile", payload.length);
            mf.writeBytes(payload, 0, 0, payload.length);
            InputStream is = mf.getInputStream();
            Bitmap bmp = BitmapFactory.decodeStream(is);
            img1.setImageBitmap(bmp); 
        } catch (IOException e) {               
            e.printStackTrace();
        }

Pero esto todavía no funciona.

¿Cómo puedo cargar con éxito una matriz de bytes en este formato en Android para mostrar la imagen?

¿Fue útil?

Solución

Según Bing y aquí, este error probablemente indica una imagen no válida. Me verificaría cuidadosamente que esté descargando la URL correcta. Si es así, intente imprimir el contenido de ese byte [] en el registro (o verificarlo en el depurador); Vea si es un mensaje HTML de algún tipo.

¡Bingo! Según su información adicional, estos son datos codificados en Base64. Lo que publicaste se parecía demasiado a texto plano, así que intenté ejecutarlo a través de Uudecode y Base64 -d en mi máquina Linux. Este último funcionó, generando un archivo que fue reconocido como JPEG.

Decodificar esto debería ser bastante simple. Cambia esto:

Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
img1.setImageBitmap(bmp); 

a esto:

import android.util.Base64;
...
payload = Base64.decode(payload, Base64.Default);
Bitmap bmp = BitmapFactory.decodeByteArray(payload, 0, payload.length);
img1.setImageBitmap(bmp); 

¡Hágamelo saber!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top