OptiPNG: Optimización de imágenes PNG

El otro día hablé de pngcrush, una aplicación libre y multiplataforma que permite reducir el peso de una imagen PNG sin que haya pérdida de calidad. Hoy toca hablar de OptiPNG, una herramienta similar que está basada en pngcrush.

Está publicado bajo licencia zlib (compatible con GPL) y está desarrollado por Cosmin Truţa. Está disponible en los repositorios de varias distros, pero también hay versión para Windows y Mac OS.

Al igual que pngcrush, funciona por línea de comandos, pero usarlo es tan fácil como escribir:

optipng imagen.png

Sin embargo, lo que sí diferencia a ambas herramientas es la versatilidad de OptiPNG. Es una aplicación más completa, no solo porque a través de diversos parámetros permite gestionar muchos detalles del proceso, sino porque además permite convertir imágenes en formato BMP, GIF, PNM y TIFF a formato PNG con optimización incluida.

El problema es que gestionar detalles de la optimización no es una tarea fácil, pero sí podemos exprimir con facilidad la capacidad de optimización de esta forma:

optipng -o6 imagen-original.png -out imagen-optimizada.png

En este caso estamos utilizando los parámetros:

  • -o6: Define el nivel de optimización, en este caso estamos usando el 6. Con -o1 estaríamos realizando una sola prueba de recompresión, mientras que -o2 sería el nivel por defecto que se usa al ejecutar el comando como "optipng imagen.png". Cuanto mayor sea el nivel, más "potente" es la optimización.
  • -out: Permite especificar el nombre del archivo resultante. Si no usamos este parámetro, la imagen optimizada sobreescribe la original.

Un dato adicional sobre el parámetro -oX (siendo X el nivel de optimización). El nivel 6 prueba 120 métodos (similar a la opción -brute de pngcrush) y el 7 llegaría hasta 240 métodos o pruebas de compresión. En muy pocos casos el nivel 7 consigue mejores resultados que el 6, así que este último es más que suficiente.

Vuelvo a poner un ejemplo con FanTux, creado por adrielhernandez y publicado en TuxFactory bajo licencia Creative Commons by-nc-sa. Antes de optimizarla con optipng, la he reducido a 128x128 con GIMP para que no sea tan pesada y la he guardado sin tocar nada más.

FanTux OriginalFanTux OptiPNG

A la izquierda tenemos la imagen original, a la derecha la imagen optimizada con OptiPNG utilizando el nivel 6 de optimización (-o6). No hay ningún cambio, pero la imagen original pesa 23,76 KB y la optimizada 21,43 KB, lo que supone una reducción del 10% (aproximadamente) sobre la original, sin pérdida de calidad. El nivel 7 de optimización da el mismo resultado.

Si lo comparamos con el resultado que dio pngcrush, podemos comprobar que la imagen optimizada con OptiPNG pesa un poquito más, exactamente 21 bytes más (una cantidad despreciable). Eso sí, he de reconocer que he obtenido mejores resultados con OptiPNG salvo casos contados, como este.

Imagen de Anónimo

Si se comprueba la lista de

Si se comprueba la lista de opciones con optipng --help o las páginas man de optipng se puede apreciar que el nivel máximo y paranoico de combinaciones de compresión puede llegar a 1080 métodos o pruebas. Prácticamente nunca hará falta hacerlo. Si la imagen que se quiere tratar es especialmente grande puede tardar una barbaridad, hasta cerca de 10 veces más que con -o6.

optipng -zc1-9 -zm1-9 -zs0-3 -f0-5 archivo.png haría esa forma paranoica de 1080 pruebas.

Sin embargo esto no queda aquí, se puede personalizar manualmente el tamaño de ventana zlib. En principio esto es automático pero en ocasiones contadas y con imágenes pequeñas se pueden arrancar unos bytes más. Eso se consigue con el parámetro -zw seguido de un valor que puede ir de 512 a 32k, en múltiples de dos (512, 1k, 2k, 4k, 8, 16k y 32k).

Otrp detalle es que OptiPNG por defecto respeta el estado del entrelazado de las imágenes PNG. Un PNG puede ir entrelazada o no. Cuando está entrelazada inicialmente el programa correrá optipng haciendo compresión en formato entrelazado. Si se quiere forzar el entrelazado o por el contrario quitarlo (experimentar con esto puede ahorrar una cantidad razonable en el tamaño final) se consigue con el parámetro -i seguido de 0 (sin entrelazar) ó 1 (entrelazado). Por ejemplo -i 0 forzará no entrelazado en una imagen que pudiera estarlo.

Imagen de Anónimo

Buenas, te hago una consulta,

Buenas, te hago una consulta, ¿Cuál es la diferencia entre una imagen entrelazada y una no-entrelazada?

Imagen de Anónimo

:) Se ve bastante bueno... a

:) Se ve bastante bueno... a mi me servirá, en los juegos y en las webs que uso empleando PNGs, así hago que no pesen una tonelada y guarden la misma calidad.

Gracias por el programa.

Imagen de Falc

Thalskarth, si te defiendes

Thalskarth, si te defiendes unn poco en inglés échale un vistazo al artículo en la Wikipedia: http://en.wikipedia.org/wiki/Interlacing_%28bitmaps%29

Si alguna vez has intentado cargar una imagen muy grande y pesada, habrás visto que en algunos casos se empieza a mostrar su parte superior y va cargando hasta que termina viéndose también la parte de abajo. Esas imágenes no utilizan entrelazado.

Puede que hayas visto otras imágenes que no cargan así, sino que se muestran todos los pixels (o al menos parte de ellos) en pantalla pero al principio parece que la calidad de la imagen es malísima, o que incluso la imagen se muestra con "cuadraditos", y con el tiempo va mejorando y se hace más nítida. Esas otras imágenes utilizan entrelazado (hay varios métodos de entrelazado).

En cualquier caso, supone que una imagen ocupe un poquito más, pero a cambio la visualización de la imagen es distinta. Hace años, cuando las conexiones a internet eran más lentas, se puso de moda el entrelazado, pero a día de hoy creo que ha perdido popularidad.

Una demostración de varios tipos de entrelazado y como se muestran las imágenes durante esa carga: http://nuwen.net/png.html

Dime si te ha quedado claro.

Imagen de Anónimo

Muchas gracias por la

Muchas gracias por la respuesta ;). Más o menos me he hecho una idea de lo que es. Ahora le pego una leída a los links que me recomendaste.

Gracias ;)

Imagen de Anónimo

Me han gustado más los

Me han gustado más los comentarios que la entrada en sí, con permiso de Falc xD.

Muy interesante la información del entrelazado, me había fijado en lo de la calidad mala y luego mejorando, pero no sabía que tenía esa explicación. Y estoy de acuerdo, ya hoy en día el entrelazado tiene poco sentido.

Imagen de Anónimo

Es solo una vieja cuestión

Es solo una vieja cuestión estética pasada de moda. Como apunte los JPEG también tienen un sistema de carga equivalente al entrelazado de GIF y PNG, es el "progresivo", aunque en la mayoría de casos también hace que ocupe más tamaño. Aquí un ejemplo: http://upload.wikimedia.org/wikipedia/en/5/5d/Fakaravaversion2.jpg