2010-10-14 16 views
87

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.Cuándo usar PNG o JPG en el desarrollo de iPhone?

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

He leído que se prefiere utilizar PNG como formato de imagen, pero al ver que la versión JPG será mucho menor, prefiero estar usando ese.

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

+0

que quería añadir que las imágenes originales están todos en formato JPG ya de por si hay alguna diferencia. – Maverick

Respuesta

128

PNG son píxeles perfectos (sin pérdida) y requieren muy poca energía extra de la CPU para mostrar. 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érdida (la cantidad depende del nivel de compresión), y para visualizarlos requiere un algoritmo de decodificación mucho más complicado. Pero la compresión típica y la calidad de imagen suelen ser suficientes para las fotos.

Uso JPG de para fotos y para cualquier cosa grande, y PNG para cualquier cosa pequeña y/o diseñado para ser visualizado "pixel perfecto" (por ejemplo iconos pequeños) o como parte de una cubierta transparente compuesta, etc.

+48

+1. Además, PNG admite transparencia, lo que no ocurre con los archivos JPEG. – Cameron

+1

Todavía tengo que ver datos sobre el rendimiento de decodificación JPEG vs PNG vs iPNG. A veces, el formato más comprimido es mejor debido a la reducción de E/S requerida; No estoy seguro de qué tan rápido es la unidad flash del iPhone. Y yo * definitivamente * no diría que la descompresión de PNG requiere "muy poca" energía; el archivo Other.artwork parece ser datos brutos de mapa de bits, presumiblemente porque la carga general de CPU/memoria de la descompresión PNG es demasiado para los componentes UI comúnmente utilizados. –

+2

En mi proyecto actual, tenemos archivos png muy grandes debido a un requisito de transparencia. El disco IO supera en gran medida el tiempo dedicado a decodificar un archivo JPEG. Tenga en cuenta que los PNG también están comprimidos, simplemente usando un algoritmo diferente. – John

1

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

+3

Esto no aborda ninguna consideración de rendimiento de JPG frente a PNG. – daveMac

19

Apple optimiza las imágenes PNG que se incluyen en el paquete de aplicaciones de iPhone. De hecho, el iPhone usa una codificación especial en la que los bytes de color están optimizados para el hardware. XCode maneja esta codificación 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, etiquetas, etc.).

En cuanto a mostrar una imagen de pantalla completa como una fotografía, puede obtener beneficios con PNG ya que no pierden y la calidad visual debe ser mejor que un JPG sin mencionar el uso de recursos con la decodificación 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 ciertamente un factor, pero también hay otras consideraciones en juego cuando se elige un formato de imagen.

+5

[En mi punto de referencia] (http://imageoptim.com/tweetbot.html) la optimización de Xcode en realidad hizo que los archivos fueran más lentos, probablemente porque la E/S de disco, no la CPU, es el cuello de botella. – Kornel

+1

"Apple optimiza las imágenes PNG que se incluyen en el paquete de aplicaciones de iPhone": ¿Esto significa que los archivos PNG que se descargan dinámicamente no están optimizados? – Robert

+1

No, los PNG descargados dinámicamente no están optimizados. La optimización es básicamente cambiar el orden de bytes de RGBA a BGRA, que es lo que el chip gráfico de iPhone usa internamente. Más información aquí: http://graphicsoptimization.com/blog/?p=259 –

7

Sólo pensé en compartir un poco de datos de rendimiento de descompresión ...

estoy haciendo algunos prototipos de un visor de 360 ​​grados - un carrusel en el que el usuario puede girar a través de una serie de fotos tomadas desde diferentes ángulos, 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 es solo la ejecución general del programa y mover todos los datos en la memoria, pero esa descompresión de la imagen se realiza en la GPU. De cualquier manera y el JPG vs.El argumento de rendimiento 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 ...

+2

La GPU no puede descomprimir PNG. El formato de desinflado que utiliza no es adecuado para el tipo de paralelización que permite la GPU. Supongo que la decodificación JPG puede acelerarse parcialmente por GPU, ya que hay una conversión de espacio de colores involucrada. – Kornel

5

he encontrado enormes diferencias en el rendimiento de la animación cuando se utilizan archivos JPEG 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.

8

El Cocoanetics blog published a nice iOS performance benchmark de JPG en varios niveles de calidad, y PNG, con y sin trituración.

Desde su conclusión:

Si es absolutamente necesario un canal alfa o tener que ir con PNG entonces es recomendable instalar la herramienta pngcrush en su servidor web y haga que procese todos los archivos 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 compresión y reproducción más rápidas.

Resulta que PNG son grandes para las pequeñas imágenes que utilizaría para los elementos de interfaz de usuario, pero no son razonable utilizar para cualquier completos aplicaciones en pantalla tales como catálogos o revistas. Allí desea para elegir una calidad de compresión entre 60 y 80% dependiendo de su material fuente .

En términos de obtener todo para mostrar, querrá esperar instancias de UIImage de las que haya dibujado una vez porque tienen una versión sin comprimir en caché del archivo en ellas. Y donde no haga la pausa visual para que aparezca una imagen grande en la pantalla, tendrá para forzar la descompresión de un par de imágenes por adelantado. Pero ten en cuenta que estos tomarán grandes cantidades de RAM y si estás exagerándolo que podría causar que tu aplicación se termine. NSCache es un gran lugar para colocar imágenes de uso frecuente , ya que esto automáticamente se encarga de desalojar 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 tener expulsado de la versión sin comprimir sin informarnos sobre este efecto . Ese podría ser un buen Radar para plantear en el error de Apple informando el sitio . Pero, afortunadamente, acceder a la imagen como se muestra arriba no requiere tiempo si la imagen ya está descomprimida. Por lo tanto, puede hacer eso no solo "justo a tiempo" sino también "por si acaso".

+0

¡Exactamente, y JPEGMini e ImageOptim hacen jpegs realmente pequeños! –

11

Hay una cosa importante en la que pensar con los PNG. Si se incluye un PNG en tu compilació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 archivos PNG, debería considerar triturar los PNG en el servidor antes de la descarga.

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

Cuestiones relacionadas