Banner 1

Cambiar la calidad de imágenes por lote usando BASH

Reducir la calidad de un JPG en ocasiones permite que reduzcas su tamaño en bytes con un impacto visual muy bajo, las ventajas de hacer esto en un directorio como lo es el de uploads de WordPress es que reduces el espacio que estas usando en disco duro, el ancho de banda que consumes y tu pagina carga mas rápido.

Con BASH e ImageMagick puedes cambiar el peso de una imagen ajustando su calidad
Con BASH e ImageMagick puedes cambiar el peso de una imagen ajustando su calidad

La suite ImageMagick ofrece identify entre sus aplicaciones la que nos permite ver información acerca de una imagen. En este caso lo usaremos para ver la calidad de un JPG y también usaremos convert de la misma suite (ImageMagick) para ajustar la calidad de la imagen.
En caso de que necesiten instalar ImageMagick, solo deben abrir un terminal y ejecutar como root en su Fedora Linux:
yum install ImageMagick
Recuerda que no estas obligado a usar el terminal en Fedora para instalar aplicaciones, también puedes hacerlo usando la interfaz gráfica, solo sigue mi vídeo tutorial Instalando programas en Fedora Linux
Una vez que tengas instalado ImageMagick puedes ejecutar el siguiente script:
#!/bin/bash
DIRECTORIOS="/var/www/htdocs/wordpress/wp-content/uploads/20*"
NUEVA_CALIDAD="80"
#
for IMAGENES in `find $DIRECTORIOS -type f| grep -i jpg$ `;
do CALIDAD=`identify -format %Q $IMAGENES`;
if [ "$CALIDAD" -gt "$NUEVA_CALIDAD" ];
then
echo mejorando $IMAGENES con calidad $CALIDAD
convert -quality $NUEVA_CALIDAD $IMAGENES $IMAGENES
fi
done

Como ven, en las primeras dos lineas se declara la ruta de donde están las imágenes y en el segundo se procesan. En mi caso me dispuse a ajustar la calidad de las imágenes de mi wordpress por lo que asignó a $DIRECTORIOS la ruta donde están guardadas las imágenes de los artículos. Noten que acepta wildcards.
El proceso como tal usa la salida de identify para saber la calidad actual de la imagen, luego con un condicional evaluamos si la imagen en cuestión tiene una calidad superior al valor deseado ($NUEVA_CALIDAD) y de ser así le se la cambiamos asignándole el valor de $NUEVA_CALIDAD que para este ejemplo es 80.


Eliminado meta-data y la codificación del JPEG para una imagen mas pequeña

Calidad al 100% con un tamaño o peso de 50K Calidad al 80% con un tamaño o peso de 6.7K
Calidad al 100% con un tamaño o peso de 50K Calidad al 80% con un tamaño o peso de 6.7K
El producto se puede apreciar en estas dos imágenes, la de la izquierda es la original mientras que la de la derecha es la imagen procesada. Para llegar a esta diferencia de tamaño tuve que usar medidas drásticas. aparte de ajustar la calidad a un 80%, me dispuse a eliminar la data del EXIF y cambie el subsampling pasandole a convert estos parámetros:
-quality 80 -strip -sampling-factor 4:1:1
Si quieres aplicar estos cambios a un lote de imágenes puedes usar esta versión modificada del script anterior:
#!/bin/bash
DIRECTORIOS="/var/www/htdocs/wordpress/wp-content/uploads/20*"
NUEVA_CALIDAD="80"
SAMPLING="4:1:1"
#
for IMAGENES in `find $DIRECTORIOS -type f| grep -i jpg$ `;
do CALIDAD=`identify -format %Q $IMAGENES`;
if [ "$CALIDAD" -gt "$NUEVA_CALIDAD" ];
then
echo mejorando $IMAGENES con calidad $CALIDAD
convert -quality $NUEVA_CALIDAD -strip -sampling-factor $SAMPLING $IMAGENES $IMAGENES
fi
done


Tengan en cuenta que jugar con el sampling-factor puede alterar la fidelidad de los colores de una imagen.

Fuente: http://orvtech.com/general/cambiar-calidad-imagenes-usando-bash/

3 comentarios:

Unknown dijo...

Hola,

La condición de filtrado ("grep -i jpg$ ") yo la cambiaría por "grep -i .jpg$" para asegurarme de no modificar ficheros que terminen con jpg que no sean imágenes (i.e. tips_jpg).

Por otra parte no tengo claro que la herramienta es capaz de saltar ficheros con extensión jpg que realmente no lo sean. En dicho caso pondría algo del tipo:
file $IMAGENES | grep -i jpg >/dev/null 2>&1
[ $? -eq 0 ] && "ejecutamos código de cambio de calidad

Un saludo

Unknown dijo...

Hola,

La condición de filtrado ("grep -i jpg$ ") yo la cambiaría por "grep -i .jpg$" para asegurarme de no modificar ficheros que terminen con jpg que no sean imágenes (i.e. tips_jpg).

Por otra parte no tengo claro que la herramienta es capaz de saltar ficheros con extensión jpg que realmente no lo sean. En dicho caso pondría algo del tipo:
file $IMAGENES | grep -i jpg >/dev/null 2>&1
[ $? -eq 0 ] && "ejecutamos código de cambio de calidad

Un saludo

Unknown dijo...

Hola.

Gracias por comentar, perdon lo tarde que publique el comentario :)

saludos y buen aporte

Powered by Bad Robot
Helped by Blackubay