Existen tanto herramientas online como aplicaciones y programas de sistema operativo (Linux en este caso) para optimizar imágenes de todo tipo (jpeg,jpg, png…). El problema es que la automatización de las tareas de optimización así como trabajar con una cantidad grande de imágenes se complica cuando nos limitamos a utilizar estas opciones. Para ello lo mejor es hacer uso de herramientas a través de la línea de comandos ya que nos permite crear scripts y automatizar las tareas de forma sencilla.
Optimizar imágenes jpg y jpeg en Linux
Para optimizar imágenes con formato jpeg y jpg podemos usar la herramienta jpegoptim, disponible en los repositorios oficiales de Debian y Ubuntu (en CentOS y RHEL creo que no está por repositorio, habría que instalarla manualmente):
# apt-get install jpegoptim
Su utilización básica es sencilla, ejecutamos el comando y pasamos la imagen como parámetro:
$ jpegoptim Dog.jpg Dog.jpg 640x480 24bit JFIF [OK] 36670 --> 35679 bytes (2.70%), optimized.
Por salida estándar veremos el porcentaje que se ha podido optimizar. En caso de que la imagen ya se encuentre optimizada no se modificará y aparecerá «skipped». Al ser un formato comprimido es posible que no la optimiación sea mínima o nula:
$ jpegoptim Dog.jpg Dog.jpg 640x480 24bit Exif JFIF [OK] 43486 --> 43499 bytes (-0.03%), skipped.
A la hora de procesar todo un directorio o un listado de imágenes podemos usar bucles de bash o un script según nuestras necesidades:
$ for imagen in Dog.jpg Cat.jpg Lion.jpg; do jpegoptim "$image"; done
$ for imagen in /home/foo/imagenes/*.jpg; do jpegoptim "$image"; done
Optimizar imágenes PNG en Linux
Para las imagenes PNG podemos utilizar la herramienta pngcrush, también disponible en los repositorios oficiales de Debian y Ubuntu:
# apt-get install pngcrush
En cuanto a los parámetros a utilizar, está comprobado que el parámetro «-brute» es el que mejor nivel de compresión y optimización ofrece.
-brute (use brute-force: try 126 different methods [11-136]) -c color_type of output file [0, 2, 4, or 6] -d directory_name (where output files will go)
Junto a este parámetro especificamos el nombre para la imagen que se va a generar además de la imagen origen (-e) o el directorio que contiene las imagenes (-d) si queremos procesar todas:
$ pngcrush -brute -e "dados_comprimida.png" dados.png | pngcrush 1.7.9 [...[ | and zlib version 1.2.3.3, Copyright (C) 1998-2002 (or later), | Jean-loup Gailly and Mark Adler. || Warning: versions are different between png.h and png.c || png.h version: 1.2.42 || png.c version: 1.2.44 | It was compiled with gcc version 4.4.4 and gas version 2.9.5(?). Recompressing dados.png Total length of data found in IDAT chunks = 47210 unknown chunk handling done. IDAT length with method 11 (fm 0 zl 2 zs 2) = 134056 [...] IDAT length with method 57 (fm 4 zl 4 zs 0) = 50543 IDAT length with method 58 (fm 5 zl 4 zs 0) = 50468 IDAT length with method 135 (fm 4 zl 4 zs 3) = 54923 IDAT length with method 136 (fm 5 zl 4 zs 3) = 54846 Best pngcrush method = 0 (fm 5 zl 9 zs 1) for dadosdados_comprimida.png (no IDAT change) (no filesize change) CPU time used = 2.200 seconds (decoding 0.240, encoding 1.430, other 0.530 seconds)
# pngcrush -brute -d "/home/foo/imagenes" *.png
Algunas ejecuciones más avanzadas aumentando el número de parámetros y las variables de optimización:
$ $ pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB entrada.png salida.png
Para el tema de optimizar PNGs, como herramienta online me gusta mucho tinypng.com, ofrece unos ratios de optimización bastante altos. Echadle un vistazo.