2011-04-11 12 views
6

Estoy leyendo una imagen sin procesar de la red. Esta imagen ha sido leída por un sensor de imagen, no desde un archivo.Cómo obtener un mapa de bits a partir de una imagen sin formato

Estas son las cosas que sé acerca de la imagen:
~ Altura Anchura &
~ Tamaño total (en bytes)
~ 8 bits en escala de grises
~ 1 byte/pixel

estoy tratando de convertir esta imagen a un mapa de bits para mostrar en una vista de imagen.

Esto es lo que he intentado:

BitmapFactory.Options opt = new BitmapFactory.Options(); 
opt.outHeight = shortHeight; //360 
opt.outWidth = shortWidth;//248 
imageBitmap = BitmapFactory.decodeByteArray(imageArray, 0, imageSize, opt); 

decodeByteArray vuelve nula , ya que no puede decodificar mi imagen.

También probé leer directamente desde el flujo de entrada, sin necesidad de convertir a una matriz de bytes primero:

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt); 

Esto devuelve nula también.

He buscado en este & otros foros, pero no puedo encontrar la manera de lograrlo.

¿Alguna idea?

EDITAR: Debo agregar que lo primero que hice fue verificar si la transmisión realmente contiene la imagen en bruto. Lo hice usando otras aplicaciones (iPhone/Windows MFC) & que pueden leer y mostrar la imagen correctamente. Solo necesito encontrar una forma de hacerlo en Java/Android.

Respuesta

11

Android no es compatible con los mapas de bits en escala de grises. Entonces, primero hay que extender cada byte a un int ARGB de 32 bits. Alpha es 0xff, y R, G y B son copias del valor de píxel de byte de la imagen fuente. Luego crea el mapa de bits en la parte superior de esa matriz.

También (ver comentarios), parece que el dispositivo piensa que 0 es blanco, 1 es negro - tenemos que invertir los bits de origen.

Supongamos que la imagen de origen está en la matriz de bytes llamada Src. Aquí está el código:

byte [] src; //Comes from somewhere... 
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes. 
int i; 
for(i=0;i<src.length;i++) 
{ 
    bits[i*4] = 
     bits[i*4+1] = 
     bits[i*4+2] = ~src[i]; //Invert the source bits 
    bits[i*4+3] = 0xff; // the alpha. 
} 

//Now put these nice RGBA pixels into a Bitmap object 

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits)); 
+0

@Seva Alekseyev: gracias por la respuesta. Probé tu sugerencia. Estoy obteniendo una excepción en tiempo de ejecución. Según el logcat "Buffer no lo suficientemente grande para píxeles". Estoy creando el mapa de bits usando ancho & altura de la imagen – OceanBlue

+0

@OceanBlue: el mensaje sugiere que el búfer de Bits es menor que 4 * Ancho * Alto bytes de longitud. Compruebe si es ARGB_888 es un formato de 4 bytes por píxel. –

+0

@Seva Alekseyev: Sé por Asegúrese de que el búfer Bits sea Ancho * Alto bytes largos. La imagen es de 1 byte por formato de píxeles. De modo que, incluso si creara una matriz de bytes 4 veces el tamaño, la imagen se almacenaría en la primera 1/4 parte de ella. ¿Conoces algún formato de "1 byte por píxel" en Android? – OceanBlue

1

Una vez que hice algo como esto para decodificar el flujo de bytes obtenida de vista previa de cámara de devolución de llamada:

Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
         Bitmap.Config.ARGB_8888); 

darle una oportunidad.

+1

Gracias por la respuesta. ¿Qué contiene el primer parámetro "imageBytes"? De todas las versiones sobrecargadas de Bitmap.createBitmap (...) que veo en Javadocs en línea, ninguna toma una matriz de bytes como parámetro. – OceanBlue

+1

No hay tal método. – Peter

0

Usar Drawable create from stream. Aquí le mostramos cómo hacerlo con una respuesta HttpResponse, pero puede obtener la intensidad de entrada de la forma que desee.

InputStream stream = response.getEntity().getContent(); 

    Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task"); 
+0

Gracias por su respuesta. Desafortunadamente, esto también devuelve un nulo :-(. Comprobé los JavaDocs en línea sobre por qué Drawable.createFromStream devolvería nulo a http://developer.android.com/reference/android/graphics/drawable/Drawable.html # createFromStream% 28java.io.InputStream,% 20java.lang.String% 29 pero no es detallado. Debo añadir que sé que la transmisión en sí es válida, ya que otra aplicación que no es de Android puede leerla y mostrar la imagen. (No tengo la fuente para esa aplicación). – OceanBlue

+0

Parece que su servicio no devuelve las imágenes correctamente. –

+0

Ciertamente, esto parece la posibilidad más probable, pero lo he probado y el servicio está devolviendo la imagen correctamente (vea mi EDITACIÓN en la pregunta). Así que estoy desconcertado en este momento :-( – OceanBlue

Cuestiones relacionadas