2012-09-01 14 views
5

Antecedentes:Píxeles de mapa de bits de Android: ¿escribir directamente en el archivo?

El objetivo es escribir un archivo de imagen bastante grande (al menos 2048 x 2048 píxeles) con datos renderizados por OpenGL.

Hoy primero uso glReadPixels para obtener los datos de 32 bits (argb8888) de píxeles en una matriz int.

Luego copio los datos en una nueva matriz corta, convirtiendo los valores argb de 32 bits en valores de 16 bits (rgb565). En este punto, también gire la imagen al revés y cambie el orden de los colores para hacer compatibles los datos de imagen abierta con los datos de mapa de bits de Android (orden de fila y orden de canal de color diferentes).

Finalmente creo una instancia de Bitmap() y .copyPixelsFromBuffer (Buffer b) para poder guardarlo en el disco como un archivo png.

Sin embargo, quiero utilizar memoria más eficiente para evitar fallas de memoria en algunos teléfonos.


Pregunta:

  1. ¿Puedo omitir la primera transformación de int [] -> short [] de alguna manera (y evitar la asignación de una nueva matriz de datos de píxeles)? Tal vez simplemente use matrices de bytes/búferes y escriba los píxeles convertidos en la misma matriz que leo desde ...

  2. Más importante: ¿Puedo omitir la creación del mapa de bits (aquí es donde el programa se bloquea) y de alguna manera escribir los datos directamente en disco como un archivo de imagen en funcionamiento (y evitar la asignación de los datos de píxel de nuevo en el objeto de mapa de bits)?

EDIT: Si pudiera escribir los datos directamente al archivo, tal vez yo no necesito para convertir a datos de píxel de 16 bits, dependiendo del tamaño del archivo y lo rápido que el archivo se puede leer en la memoria al un punto posterior.

+0

+1 para la excelente pregunta escrita – Ridcully

Respuesta

3

No estoy seguro de que esto podría ayudar, pero esta biblioteca PNGJ permite escribir un PNG secuencialmente, línea por línea. Si el uso de la memoria es su principal preocupación (y si puede acceder a los valores de píxeles en el orden del archivo PNG final a partir de los datos representados) podría ser útil.

+0

Este uso realmente reducido de la memoria. Con PNGJ puedo leer cada fila de píxeles a la vez (y sí, puedo leer abajo -> arriba) y escribirla directamente en la tarjeta SD. Solo necesito asignar una matriz de bytes (ancho x 3) y reutilizarla para cada fila. ¡Esto no es nada comparado con lo que hice antes! :) – cmbellman

Cuestiones relacionadas