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
- ¿Cómo verificar el desarrollo (digital) de píxeles perfectos en Android?
- Video codificar desde la secuencia de imágenes de java android
- Cómo seleccionar varios archivos en android
- Cómo borrar un ImageView en Android?
- Cómo obtener todas las imágenes y fotos de mi dispositivo android no de sdcard?
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.
- ¿Cómo puedo hacer que una imagen se agite / se mueva cuando se hace clic?
- Obtenga los metadatos de la imagen - Android
- ¿Cómo saber si dos imágenes se intersecan mientras una imagen se mueve en android?
- Java.io.IOException: BufferedInputStream está cerrado
- Androide galería circular?
- Desactivar la optimización de recursos / imágenes / png de Android
- Cómo ocultar fotos de la galería y guardarlas en mi aplicación
- Acceder a una imagen dinámicamente desde la carpeta res 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");