2009-04-29 16 views
9

Estoy tomando una imagen del rollo de la cámara y luego la uso durante un tiempo, así como también la guardo en el disco como PNG en el iPhone. Estoy recibiendo el choque extraño, presumiblemente debido a falta de memoria.jpg o png para UIImage, ¿cuál es más eficiente?

¿Hace una diferencia si lo guardo como PNG o JPG (suponiendo que elijo una nota para degradar la calidad en el caso JPG)? Específicamente:

  • ¿El UIImage utiliza más memoria después de que la recargué del disco si la guardé como PNG?
  • ¿Es posible que el hecho de guardar como PNG consuma más memoria de forma transitoria durante el proceso de guardado?

Estaba asumiendo que el UIImage era una representación de formato neutral y no debería importar, pero pensé que debería verificarlo.

Respuesta

10

Tengo una aplicación en la tienda que necesita guardar versiones intermedias de una imagen mientras se edita. En la versión original, utilicé el formato PNG para guardar, para evitar la pérdida de calidad al cargar y guardar JPEG varias veces.

En algún momento alrededor de la versión 2.2 del software, Apple introdujo un cambio en el código de escritura PNG, de manera que se requiere mucho más tiempo para guardar datos PNG de algunas imágenes. Terminé teniendo que cambiar para guardar en formato JPEG, porque mi aplicación agotaba el tiempo cuando intentaba guardar imágenes al salir.

Además, se encontrará con problemas porque guardar en formato PNG no conserva la información de "orientación" en el UIImage, por lo que una imagen tomada en orientación vertical con la cámara incorporada aparecerá rotada después de guardar y vuelva a cargarlo.

0

No tengo datos concretos, pero supongo que los PNG son preferibles porque Apple parece usar PNG prácticamente en todas partes en iPhone OS.

Sin embargo, si ya tiene el código configurado para escribir PNG, no debería ser demasiado difícil cambiarlo para escribir archivos JPEG, ¿o sí? Simplemente pruebe ambos métodos y vea cuál funciona mejor.

5

Depende del tipo de imágenes que está tratando. Si se trata de imágenes fotográficas, las imágenes JPEG casi siempre serán más pequeñas que PNG, sin pérdida de detalles perceptible como puede ver el ojo humano.

Por el contrario, si se trata de imágenes altamente no fotográficas, como elementos GUI o imágenes con bloques grandes de colores sólidos, PNG y JPEG serán comparables en tamaño, pero el PNG se guardará sin pérdida, mientras que el JPEG ser con pérdidas y tener artefactos muy visibles. Si tiene realmente imagen simple (bloques muy grandes de colores constantes, por ejemplo), entonces un PNG muy probablemente será mucho más pequeño que un JPEG, y nuevamente no tendrá ningún artefacto de compresión.

El hecho de guardar una imagen como PNG o JPEG no debería ocupar mucha memoria transitoria. Cuando una imagen está en la memoria, normalmente se almacena sin comprimir en la memoria para que se pueda dibujar en la pantalla muy rápidamente, en lugar de tener que descomprimirla cada vez que quiera renderizarla. En comparación con el tamaño de la imagen sin comprimir, la cantidad de almacenamiento extra temporal que necesita para comprimir es muy pequeña. Si puede ajustar la imagen sin comprimir en la memoria, no tiene que preocuparse por la memoria utilizada al comprimirla.

Y, por supuesto, una vez que escribe la imagen en el sistema de archivos en un almacenamiento no volátil y libera la imagen en la memoria, no importa cuán grande sea la imagen comprimida, porque no ocupa memoria principal más. El tamaño de la imagen comprimida solo afecta la cantidad de almacenamiento flash que usa, lo que puede ser un problema, pero no afecta la probabilidad de que la aplicación se quede sin memoria.

+0

Eso tiene sentido. Cuando estaba guardando fotos tomadas con el iPhone, ocasionaba un problema extraño, pero cuando usaba imágenes PNG de imágenes vectoriales relativamente simples, no había problemas para trabajar incluso con imágenes bastante grandes. –

24

estoy recibiendo el accidente extraño, presumiblemente debido a fuera de la memoria


Entonces deje lo que está haciendo ahora y calcular primero si esa es en realidad la causa del accidente.De lo contrario, hay una gran posibilidad de que esté persiguiendo el problema incorrecto aquí, solucionando un problema de memoria que no existe mientras ignora la causa real del bloqueo. Si desea solucionar un problema, comience por averiguar qué causó el bloqueo. Dando seguimiento a lo que "presumiblemente" es el problema, es una receta para perder tiempo y esfuerzo.

+2

No puedo estar de acuerdo con esto más. Si tiene un accidente, no puede arrojar un montón de cosas y esperar que algo se pegue – rpetrich

0

Use PNG siempre que sea posible. Como parte de la compilación, XCode ejecuta todos los archivos PNG a través de una utilidad (pngcrush) para comprimirlos y optimizarlos.

0
  1. es más memoria a continuación, utiliza el UIImage después de que recargarlo fuera de disco si lo guardé como un PNG? => No, es el mismo tamaño de memoria si importa desde 2 imágenes que tienen la misma resolución y la misma cantidad de canales. (como RGBA)
  2. ¿Es posible que el hecho de guardar como PNG consuma más memoria de forma transitoria durante el proceso de guardado? => No, solo afecta su memoria de disco.
Cuestiones relacionadas