30 agosto 2011

Cambiando el tamaño de tus fotos con Imagemagick

Después de las vacaciones es probable que te encuentres con un montón de fotos, como es mi caso; si además esas fotos están hechas con una cámara de 13 Mpx, te encontrarás con que tienes fotos que ocupan muchísimo espacio. Si la alta resolución de esas imágenes no es una prioridad para ti, pero sí para la persona que ha hecho las fotos, sino hubiese bastado con reducir la resolución en la propia cámara; puedes escalar esas fotografías para que ocupen menos utilizando el programa Imagemagick y el comando convert.

Para ello, lo primero que tenemos que hacer es instalar Imagemagick:

# aptitude install imagemagick

Una vez instalado, tan solo queda hacer uso del comando convert. La forma de usarlo es la siguiente:

convert [opciones] archivo_origen.extensión [opciones] archivo_destino.extensión

Para escalar las fotografías usaremos las opciones -resize WidthxHeight -quality 95. También se puede ser más concreto especificando la opción -filter filtro, puediendo encontrar información sobre ello aquí; aunque según esa información el filtro Cubic no funciona bien aumentando las imágenes, hasta ahora yo lo he usado sin notar ninguna pérdida considerable al reducirlas.

Sabiendo esto, podríamos escalar todas las imágenes con la opción -resize Widthx o -resize xHeight, que escalarían las imágenes preservando la proporción, usando el siguiente comando:

convert *.jpg -quality 95 -resize Widthx img.%03d.jpg

Por desgracia, esto haría que las fotos verticales fuesen más grandes que las horizontales, lo cual puede resultar un engorro. Para evitar esto, he hecho un pequeño script en Bash que hace uso de el comando identify, también del proyecto Imagemagick, que da información sobre las imágenes que especifiquemos. De esta forma, con el siguiente comando obtenemos la resolución de la imagen, que más tarde utilizaremos en el script:

identify -format "%wx%h" imagen.jpg

Finalmente, os dejo con el script, que básicamente transforma todas las imágenes del directorio donde se encuentra el script y las deja en el directorio DIR; las imágenes medirán como máximo WIDTH pixels de altura o de anchura:

#!/bin/bash

EXEC="convert"
EXECOPT="-quality 95 -filter Cubic -resize"
WIDTH=2856 # Esto da aproximadamente 6 Mpx para fotografías con una proporción 4:3
DIR=/tmp/sca

mkdir $DIR;
for i in `ls *.JPG`; do
 aux=`identify -format "%wx%h" $i`;
 w=`echo $aux | cut -f1 -d"x"`;
 h=`echo $aux | cut -f2 -d"x"`;
 resize=`echo ${WIDTH}x`;

 if (( $w < $h )); then resize=`echo "x$WIDTH"`; fi
 
 echo "$i: ${w}x$h -> $resize";
 output=`echo $i | sed s/.JPG/sca.jpg/`;
 eval $EXEC $i $EXECOPT $resize $DIR/$output;
done

Este script esta basado en otro que había hecho antes, que simplemente transforma el lado más pequeño de la imagen en el más grande:

#!/bin/bash

EXEC="convert"
EXECOPT="-quality 95 -filter Cubic -resize"

for i in `ls *.jpg`; do
 aux=`identify -format "%wx%h" $i`;
 w=`echo $aux | cut -f1 -d"x"`;
 h=`echo $aux | cut -f2 -d"x"`;
 resize=`echo ${h}x`;

 if (( $w < $h )); then resize=`echo "x$w"`; fi
 
 #echo "$i: ${w}x$h -> $resize";
 
 eval $EXEC $i $EXECOPT $resize `echo $i | sed s/.jpg/sca.jpg/`;
done

Espero que esta entrada os sirva de ayuda y podáis reducir esas cientos de imágenes de vuestras vacaciones.

Un saludo,
Morpheus