Pregunta

Estoy tomando una imagen del rollo de la cámara y luego la uso durante un tiempo, así como la guardo en el disco como PNG en el iPhone. Estoy teniendo alguna que otra colisión, probablemente por falta de memoria.

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

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

Había asumido que el UIImage era una representación de formato neutral y no debería importar, pero pensé que debía verificar.

¿Fue útil?

Solución

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

En algún momento en torno al lanzamiento del software 2.2, Apple introdujo un cambio en el código de escritura PNG, por lo que se tarda mucho más tiempo en guardar los datos PNG de algunas imágenes. Terminé teniendo que cambiar para guardar en formato JPEG, porque mi aplicación se había agotado cuando intentaba guardar imágenes al salir.

Además, tendrás problemas porque guardar en formato PNG no conserva la orientación " " información en el UIImage, por lo que una imagen tomada en orientación Vertical con la cámara incorporada aparecerá girada después de guardarla y volver a cargarla.

Otros consejos


  

Tengo un error imprevisto, probablemente debido a la falta de memoria


Luego DETENGA LO QUE ESTÁS HACIENDO AHORA MISMO y primero averigua si esa es realmente la causa del accidente. De lo contrario, existe una gran posibilidad de que esté persiguiendo el problema incorrecto aquí, solucionando un problema de memoria que no existe e ignorando la causa real del bloqueo. Si desea corregir un fallo, comience por averiguar qué causó el bloqueo . Seguimiento de lo que " presumiblemente " " El problema es una receta para perder tiempo y esfuerzo.

Depende de qué tipo de imágenes estás tratando. Si está tratando con imágenes fotográficas, los JPEG casi siempre serán más pequeños que los PNG, sin pérdida de detalle perceptible como lo puede ver el ojo humano.

A la inversa, si está tratando con imágenes altamente no fotográficas, como elementos GUI o imágenes con grandes bloques de colores sólidos, entonces los PNG y JPEG serán comparables en tamaño, pero el PNG se guardará sin pérdidas mientras que los JPEG serán Perdidos y tienen artefactos muy visibles. Si tiene una imagen simple realmente (bloques muy grandes de colores constantes, por ejemplo), es muy probable que un archivo PNG sea 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, por lo general se almacena sin comprimir en la memoria para poder dibujarla 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 temporal adicional que necesita para comprimirla es muy pequeña. Si puede colocar la imagen sin comprimir en la memoria, no tiene que preocuparse por la memoria utilizada mientras la comprime.

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 memoria, realmente no importa qué tan grande sea la imagen comprimida, porque no ocupa la imagen principal. la memoria más. El tamaño de la imagen comprimida solo afecta la cantidad de almacenamiento flash que está utilizando, lo que puede ser un problema, pero no afecta mucho a las probabilidades de que su aplicación se quede sin memoria.

Sus bloqueos pueden deberse a una pérdida de memoria conocida en el UIImagePickerController.

Esto debería ayudarte a solucionarlo.

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

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

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.

  1. es más memoria que la UIImage después de que la recargue ¿Disco si lo guardé como 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 el acto de guardar, ya que PNG utiliza más memoria de forma transitoria durante el proceso de guardado? = > No, solo afecta la memoria del disco.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top