Convertir todas las imágenes de una carpeta a Webp

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.

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.