Cómo obtener un mapa de bits de una imagen sin procesar

Estoy leyendo una imagen en bruto de la red. Esta imagen ha sido leída por un sensor de imagen, no desde un archivo.

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

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

Esto es lo que intenté:

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

DecodeByteArray devuelve null , ya que no puede decodificar mi imagen.

También intenté leerlo directamente del flujo de entrada, sin convertirlo primero en un array de bytes:

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

Esto también devuelve null .

He buscado en este y otros foros, pero no puedo encontrar una manera de lograr esto.

¿Algunas ideas?

EDIT: Debo añadir que la primera cosa que hice fue comprobar si la corriente realmente contiene la imagen en bruto. Hice esto usando otras aplicaciones `(iPhone / Windows MFC) y son capaces de leerlo y mostrar la imagen correctamente. Sólo necesito encontrar una manera de hacer esto en Java / Android.

Android no admite bitmaps en escala de grises. Así que lo primero, tienes que extender cada byte a un int de ARGB de 32 bits. Alpha es 0xff, y R, G y B son copias del valor del píxel del byte de la imagen fuente. A continuación, cree 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 fuente.

Por lo tanto, 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)); 

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

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

Darle una oportunidad.

Utilice Drawable create from stream. Aquí es cómo hacerlo con un HttpResponse, pero puede obtener el inputtream de todos modos que desea.

  InputStream stream = response.getEntity().getContent(); Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task"); 
  • Cargar foto en la galería como objeto de mapa de bits en Android
  • Convertir mapa de bits en sepia en android
  • ¿Existe alguna diferencia entre / mnt / sdcard y / sdcard?
  • Cómo seleccionar aleatoriamente los recursos (R.drawable.xxxx)
  • ¿Cómo puedo guardar un mapa de bits con onRetainNonConfigurationInstance () para la orientación de la pantalla?
  • Retención de la orientación de la imagen después de la compresión
  • Imagen 9patch con sólo escala horizontal
  • Acceder a imágenes de la aplicación Fotos en mi aplicación Android
  • La falla de carga de AWS S3 encontró una excepción que no se pudo volver a intentar en Android
  • Android, selección de imagen
  • Texto de Android sobre la imagen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.