2011-12-28 13 views
6

De experimentos y de leer otras publicaciones like this one parece que es difícil procesar imágenes de alta resolución en Android porque hay un límite en la cantidad de memoria que la VM permitirá asignar.Procesamiento de imágenes de alta resolución Android

Cargar una cámara de 8MP toma alrededor de 20 MB de memoria.

Entiendo que la solución más fácil es reducir la resolución de la imagen al cargarla (BitmapFactory ofrece esa opción) pero aún me gustaría procesar la imagen en resolución completa: la cámara dispara 8MP, ¿por qué usaría solo 4MP y reducir la calidad

¿Alguien sabe buenas soluciones para eso?

Respuesta

1

2 cosas:

  1. Pedido la galería en nido de abeja. Hace esta representación basada en mosaico. Puede acercar una imagen y verá que la parte actual es más alta que las otras partes. Si te das vuelta, lo ves renderizado.

  2. Al usar código nativo (NDK) no hay un límite de recursos. Entonces podrías tratar de cargar todos los datos nativos y de alguna manera obtener partes usando JNI, pero dudo que sea mejor que la galería de honeycom.

+0

En cuanto a 1. BitmapFactory está diseñado para hacer cosas como esa: cargar solo una región, cargar en una resolución más baja. Las regiones de carga podrían ser útiles para lograr el mosaico como sugiere @ paul-sasik. – Kamchatka

+0

En cuanto a 2. los mismos límites se aplican al código nativo. Me encuentro con errores OutOfMemory nativos que representan cosas. –

2

En un entorno con recursos limitados, creo que su única solución es dividir y conquistar: p. almacenamiento en caché/mosaico (como en: mosaicos)

En lugar de cargar y procesar la imagen de una vez, carga/guarda fragmentos manejables de la imagen de un archivo de datos brutos para procesarlos. Esto no es trivial y podría volverse realmente complejo dependiendo del tipo de procesamiento que quiera hacer, pero es la única manera si no desea comprender la calidad de la imagen.

+0

Pensé en el mosaico. Hace que el procesamiento de la imagen sea un poco más complicado, pero el principal inconveniente es que al final tengo que reconstruir el archivo final, que sería de un montón de archivos temporales. Eso es probablemente factible pero muy pesado. – Kamchatka

+0

Si las dimensiones de su imagen no cambian durante el procesamiento, entonces no necesitaría archivos temporales. Puede escribir secciones/mosaicos procesados ​​en las secciones adecuadas del archivo de imagen. –

+0

Derecha. Me temo que el tiempo de procesamiento es muy malo con todos los IO. ¿Alguna idea de cuánto más lento es escribir en la memoria flash en comparación con la RAM del teléfono? – Kamchatka

2

De hecho, esto es difícil. Pero en caso de que la imagen esté en algún formato de ráster continuo, puede mapearlo (ver java.nio.ByteBuffer) - de esta manera se obtiene el buffer de bytes sin asignarlo.

Cuestiones relacionadas