Hace poco me di a la tarea de averiguar cómo convertir todas las imágenes de una carpeta a Webp como optimización final antes de subirlas a este blog.
Estos comandos y scripts son muy útiles para automatizar la conversión de los archivos y ahorrar tiempo.
Tabla de contenidos
Mogrify
Al principio me fui con la vieja confiable de mogrify de ImageMagick.
Por ejemplo, convertir todos los archivos jpg de una carpeta es tan sencillo como hacer.
mogrify -format webp *.jpg
Y con eso se soluciona todo … peeeeeerooooo… quise investigar si había algunas opciones para optimizar aún más el tamaño de las imágenes.
cwebp
En esas andaba cuando me encontré con la herramienta de conversión de Google cwebp que funciona excelente. Pero que hasta donde tengo entendido, no puedo convertir carpetas completas de imágenes.
cwebp -m 6 -q 80 -mt -af -progress test1.png -o test1.webp
O para simplificar un poco, hice un alias que agregué al archivo .zshrc
Tuve que programar una función para que aceptara un par de parámetros, el nombre del archivo jpg y el nombre del archivo resultante webp.
jpg2webp(){ if [ $# -lt 2 ] then echo "Faltan parámetros. Ejemplo: cjw imagen.jpg imagen.webp" else cwebp -m 6 -q 80 -mt -af -progress $1 -o $2 fi } alias cjw=jpg2webp
Este alias funciona muy bien si lo que quieres hacer es convertir un solo archivo, pero cuando es una carpeta con muchas imágenes es mejor otro enfoque.
Otra vez pensé hacer un script estilo bash | zsh que tomara todos los archivos de la carpeta e hiciera la conversión. Pero luego me acordé de un viejo amigo que ya he utilizado anteriormente parallel.
Parallel
Con parallel tengo la ventaja de aplicar el mismo proceso a todos los archivos de una carpeta y asignar el número de procesadores que voy a utilizar para hacer las conversiones.
Dicho esto la instrucción queda más o menos así
parallel -j 3 --eta cwebp -m 6 -q 80 -mt -af -progress '{}' -o '{.}.webp' ::: *.jpg
Con eso logro convertir todas las imágenes jpg a webp de una carpeta. Con algunas pequeñas modificaciones hago lo mismo para convertir los archivos png.
Automatiza y avanza
Ya como cereza del pastel, agregué algunos alias para hacerme la vida más sencilla.
# Conversión de imágenes a webp alias j2w="parallel -j 3 --eta cwebp -m 6 -q 80 -mt -af -progress '{}' -o '{.}.webp' ::: *.jpg" alias p2w="parallel -j 3 --eta cwebp -m 6 -q 80 -mt -af -lossless -progress '{}' -o '{.}.webp' ::: *.png" alias i2w="j2w; p2w"
Actualización: Un alias con bash
Algo pasó con una actualización de Manjaro que parallel dejó de funcionar 🙁
Al ejecutar el alias aparece un mensaje de error:
Undefined subroutine &SSHLogin::slurp_or_exit called at /usr/bin/parallel line 8401.
Tuve que buscar una opción más tradicional con Bash.
Así quedaron los alias correspondientes.
alias j2w='for file in *.jpg; do if [ -f "$file" ]; then cwebp -q 90 $file -o "${file%.*}.webp" ; fi; done' alias p2w='for file in *.png; do if [ -f "$file" ]; then cwebp -q 90 -lossless $file -o "${file%.*}.webp" ; fi; done' alias i2w="j2w; p2w"
Un alias para convertir archivos jpg, otro para png y uno más para ambos.
Hay otra variante si decide elegir varios tipos de archivos en un ciclo for. Intenté varias recomendaciones y la única que funcionó es con un OR al momento de elegir las extensiones, no es lo más elegante, pero sirve:
alias i2w='for file in *.jpg or file in *.jpeg or file in *.png; do if [ -f "$file" ]; then cwebp -q 90 $file -o "${file%.*}.webp" ; fi; done'
Y con eso tengo más que suficiente para optimizar todas las imágenes de cada artículo que publico en este espacio.
Espero que algo de esta información les sea de utilidad.