Cuadros de bits en escala de grises en android

Tengo una matriz de bytes que corresponden a un "bitmap en grises" (un byte-> un píxel), y necesito crear un archivo PNG para esta imagen.

El método siguiente funciona, pero el png creado es ENORME, ya que el Bitmap que estoy usando es un mapa de bits ARGB_8888, que toma 4 bytes por píxel en lugar de 1 byte.

No he sido capaz de hacerlo funcionar con otro Bitmap.Config diferente de ARGB_8888. Tal vez ALPHA_8 es lo que necesito, pero no he sido capaz de hacer que funcione.

También he intentado el método toGrayScale que se incluye en algunos otros puestos ( Convertir un mapa de bits a GrayScale en Android ), pero tengo el mismo problema con el tamaño.

public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width, int height,File pngFile) throws IOException{ if (grayBytes.remaining()!=width*height){ Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null); return false; } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // for each byte, I set it in three color channels. int gray,color; int x=0,y=0; while(grayBytes.remaining()>0){ gray = grayBytes.get(); // integer may be negative as byte is signed. make them positive. if (gray<0){gray+=256;} // for each byte, I set it in three color channels. color= Color.argb(-1, gray, gray, gray); bitmap.setPixel(x, y, color); x++; if (x==width){ x=0; y++; } } FileOutputStream fos=null; fos = new FileOutputStream(pngFile); boolean result= bitmap.compress(Bitmap.CompressFormat.PNG,100,fos); fos.close(); return result; } 

EDIT: Enlace con el archivo generado (puede parecer absurdo, pero se acaba de crear con datos randon). http://www.tempfiles.net/download/201208/256402/huge_png.html

Cualquier ayuda será apreciada.

Como has notado, guardar una imagen en escala de grises como RGB es caro. Si tiene datos de luminancia, entonces sería mejor guardar como PNG de escala de grises en vez de RGB PNG.

La funcionalidad de mapa de bits e imagen disponible en el marco de Android está realmente orientada hacia la lectura y la escritura de formatos de imagen que son compatibles con el marco y los componentes de interfaz de usuario. El PNG de escala de grises no se incluye aquí.

Si quieres guardar un PNG de escala de grises en Android, deberás usar una biblioteca como http://code.google.com/p/pngj/

Si utiliza OPENCV para la biblioteca de Android, puede utilizar la biblioteca para guardar datos binarios en un archivo png. Mi camino es: en jni parte, establece Mat cuyos datos comienzan con la matriz de bytes:

 jbyte* _ByteArray_BrightnessImgForOCR = env->GetByteArrayElements(ByteArray_BrightnessImgForOCR, 0); Mat img(ByteArray_BrightnessImgForOCR_h, ByteArray_BrightnessImgForOCR_w, CV_8UC1, (unsigned char *) _ByteArray_BrightnessImgForOCR); 

Y luego escribirlo en un archivo png.

 imwrite("/mnt/sdcard/binaryImg_forOCR.png", img); 

Por supuesto, necesitas tomarte un tiempo para familiarizarte con la codificación nativa de OpenCV y Java. Siguiendo los ejemplos de OpenCV para Android , es rápido aprender.

  • Android: cómo deformar imágenes?
  • Umbral adaptable rápido para Canny Edge Detector en Android
  • Implementación de diferentes modos PorterDuff en android
  • Uso de OpenCV en Java Camera2 API
  • Recortar parte particular de la imagen en android
  • Dilatación y erosión en Android
  • Cómo desenfocar una parte de la imagen en Android?
  • Optimización de la mezcla por pixel en mapas de bits de Android
  • Usando get () y put () para acceder a valores de píxeles en OpenCV para Java
  • Hacer que la imagen superpuesta sea transparente al tocar en Android?
  • ¿Hay alguna biblioteca de efectos de imagen (por ejemplo, lomo) para Android o iPhone?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.