Cuándo usar PNG o JPG en el desarrollo de iPhone?

Tengo una aplicación que mostrará un montón de imágenes en una presentación de diapositivas. Esas imágenes serán parte del paquete, distribuidas de esta manera con la aplicación.

Todas las imágenes son fotografías o fotografías, etc.

He leído que se prefiere usar PNG como formato de imagen, pero dado que la versión JPG será mucho más pequeña, preferiría utilizarla.

¿Hay alguna guía que formato utilizar y en qué caso?

Los PNG son perfectos en píxeles (sin pérdida) y requieren muy poca energía extra de la CPU para mostrarse. Sin embargo, los archivos PNG grandes pueden tardar más en leerse desde el almacenamiento que los formatos de imagen comprimidos y, por lo tanto, son más lentos de visualizar.

Los JPG son más pequeños de almacenar, pero con pérdidas (la cantidad depende del nivel de compresión), y para visualizarlos requiere un algoritmo de deencoding mucho más complicado. Pero la compresión típica y la calidad de imagen suelen ser suficientes para las fotos.

Use JPG para fotos y para cualquier cosa grande, y PNG para cualquier cosa pequeña y / o diseñada para mostrarse “pixel perfect” (por ejemplo, pequeños icons) o como parte de una superposición transparente compuesta, etc.

Apple optimiza las imágenes PNG que se incluyen en el paquete de aplicaciones de iPhone. De hecho, el iPhone usa una encoding especial en la que los bytes de color están optimizados para el hardware. XCode maneja esta encoding especial para usted cuando construye su proyecto. Por lo tanto, ve beneficios adicionales al uso de PNG en un iPhone que no sea su consideración de tamaño. Por este motivo, definitivamente se recomienda utilizar PNG para cualquier imagen que aparezca como parte de la interfaz (en una vista de tabla, tags, etc.).

En cuanto a mostrar una imagen de pantalla completa, como una fotografía, aún puede obtener beneficios con PNG, ya que no tienen pérdida y la calidad visual debe ser mejor que un JPG sin mencionar el uso de recursos con la deencoding de la imagen. Puede que necesite disminuir la calidad de sus JPG para ver un beneficio real en el tamaño del archivo pero luego está visualizando imágenes no óptimas.

El tamaño del archivo es sin duda un factor, pero también hay otras consideraciones en juego al elegir un formato de imagen.

Hay una cosa importante en la que pensar con PNG. Si se incluye un PNG en tu comstackción Xcode, estará optimizado para iOS. Esto se llama enamoramiento PNG. Si su PNG se descarga en tiempo de ejecución, no se aplastará. Los PNG aplastados funcionan aproximadamente igual que 100% JPG. Los JPG de menor calidad funcionan mejor que los JPG de mayor calidad. Por lo tanto, desde el punto de vista del rendimiento, de más rápido a más lento, se trataría de JPG de baja calidad, JPG de alta calidad, PNG triturado, PNG.

Si necesita descargar PNG, debería considerar aplastar los PNG en el servidor antes de la descarga.

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

El blog de Cocoanetics publicó un buen punto de referencia de rendimiento de iOS de JPG en varios niveles de calidad y PNG, con y sin aplastamiento.

De su conclusión:

Si necesitas absolutamente un canal alfa o tienes que ir con PNG, entonces es recomendable instalar la herramienta pngcrush en tu servidor web y que procese todos tus PNG. En casi todos los demás casos, los archivos JPEG de alta calidad combinan tamaños de archivo más pequeños (es decir, una transmisión más rápida) con una compresión y renderización más rápidas.

Resulta que los PNG son ideales para imágenes pequeñas que usarías para elementos de UI, pero no son razonables para usar en aplicaciones de pantalla completa como catálogos o revistas. Allí le conviene elegir una calidad de compresión entre 60 y 80% dependiendo de su material de origen.

En términos de mostrarlo todo, querrá esperar instancias de UIImage de las que haya dibujado una vez porque tienen una versión del archivo sin comprimir almacenada en caché. Y cuando no haga la pausa visual para que aparezca una imagen grande en la pantalla, deberá forzar la descompresión para un par de imágenes de antemano. Pero tenga en cuenta que esto requerirá grandes cantidades de RAM y, si está exagerando, podría provocar el cierre de su aplicación. NSCache es un gran lugar para colocar imágenes de uso frecuente porque esto automáticamente se ocupa de expulsar las imágenes cuando la RAM escasea.

Es lamentable que no tengamos forma de saber si una imagen aún necesita descompresión o no. También una imagen podría haber expulsado la versión sin comprimir sin informarnos sobre este efecto. Ese podría ser un buen Radar para boost en el sitio de notificación de errores de Apple. Pero, afortunadamente, acceder a la imagen como se muestra arriba no toma tiempo si la imagen ya está descomprimida. Así que podrías hacer eso no solo “justo a tiempo” sino también “por las dudas”.

Solo pensé en compartir un poco de datos de rendimiento de descompresión …

Estoy haciendo un prototipo de un visor de 360 ​​grados: un carrusel donde el usuario puede girar a través de una serie de fotos tomadas desde diferentes angularjs, para dar la impresión de poder rotar suavemente un objeto.

He cargado los datos de imagen en una matriz de NSData para sacar archivos de E / S de la ecuación, pero creo NSImage sobre la marcha. Probando casi la máxima velocidad de cuadro (~ 25 fps) y viendo en los instrumentos, veo que la aplicación está claramente unida a la CPU y hay aproximadamente un 10% de aumento en la carga de la CPU que muestra ~ 275 kb png vs. ~ 75 kb jpg.

No puedo decirlo con certeza, pero supongo que el límite de la CPU proviene solo de la ejecución general del progtwig y de mover todos los datos en la memoria, pero la descompresión de la imagen se realiza en la GPU. De cualquier manera, el argumento de rendimiento JPG vs. PNG busca favorecer JPG, especialmente cuando se toman en consideración los tamaños de archivo más pequeños (y por lo tanto tamaños más pequeños de objetos en la memoria, al menos en algunas partes de la cadena).

Por supuesto, cada situación es diferente, no hay sustituto para las pruebas …

He encontrado diferencias masivas en el rendimiento de la animación cuando uso jpegs vs png. Por ejemplo, colocar tres jpegs del tamaño de una pantalla uno al lado del otro en un UIScrollView y desplazarse horizontalmente en un iPhone4 produce un retraso y una animación espasmódicamente desagradable. Con pngs no transparentes de las mismas dimensiones, el desplazamiento es suave. Nunca uso jpegs, incluso si la imagen es grande.

Creo que si quieres usar transparente, no tienes más opción que PNG. Pero, si su fondo ya es opaco, entonces puede usar JPG. Esa es la única diferencia que puedo ver

‘Usar JPEG para fotos’ como se menciona en las Pautas de interfaz humana en la sección Producir ilustraciones en el formato apropiado.