Imagemagick - Manipulación de cientos de imágenes a la vez.

1.Introducción
2.Instalación
3.Usos básicos
4.Usos complejos
5.Notas
6.Fuentes y enlaces

1.Introducción

Gran parte de las cámaras fotográficas digitales memorizan las fotos con nombres compuestos por una mezcla de letras mayúsculas, minúsculas y números, creando una suerte de caos en lo que se refiere a identificación de cada foto, ó incluso la modificación de varias imágenes a la vez, ya que la extensión (lo que indica el formato) suele estar en unas fotos en mayúscula y en otras en minúscula cuando provienen de cámaras diferentes.
Afortunadamente en Linux cosas como estas se pueden resolver fácilmente.

2.Instalación

Para eso necesitamos de una potentisima aplicación llamada imagemagick

La instalamos ejecutando:

sudo aptitude install imagemagick libjpeg-progs netpbm dcraw

NOTA: libjpeg-progs, netpbm y dcraw los instalaremos para completar el set de instrumentos de manipulación de imágenes que nos brinda imagemagick.

3.Usos básicos

Para comenzar nos ubicamos en el directorio donde están las fotos o imágenes que queremos modificar con

$ cd nombre_directorio

y podemos transformar todos los nombres (y sus extensiones) de las imágenes de ese directorio en minúscula desde la consola ejecutando:

$ rename 'y/A-Z/a-z/' *

Luego podemos renombrar todas las fotos con un nombre que nos recuerde de que cosa se tratan o donde fueron tomadas, etc, ejecutando:

$ for n in *.jpg; do let q+=1 ; mv $n nombre_elegido$q.jpg; done

con este comando tomamos todos los archivos jpg (anteponiemdo el asterisco) del directorio los renombramos (mv) con un nombre en común (nombre_elegido) mas un numero secuencial creciente ($q) y su extensión (.jpg)

Si se prefiere, en vez de esto, podemos dejarles el nombre original pero anteponiendo una palabra en común que identifique, por ejemplo, donde hemos tomado las fotos:

$ rename 's/^/cumple_camila/' *.jpg

así todas las fotos comenzaran con "cumple_camila" + el nombre original

Para terminar podemos también redimensionarlas a todas de un solo golpe:

$ mogrify -geometry 800x600 *jpg

con este comando tendremos todas las imágenes .jpg con una dimensión de 800x600 manteniendo las proporciones.

NOTA: téngase presente que los comandos ejecutados hasta aquí afectan a todos los archivos con extensión jpg que se encuentren en el directorio en el que estamos situados.

Mogrify es uno de los comandos de imagemagick con el que se pueden hacer unas cuantas transformaciones en un click, por ejemplo:

Para redimensionar una imagen manteniendo sus proporciones

$ mogrify -geometry anchoxalto imagen.extensión

ejemplo de redimensionamiento de la imagen cumple_camila.jpg a 800x600

$ mogrify -geometry 800x600 cumple_camila.jpg

en cambio para reducir una imagen a la mitad

$ mogrify -geometry 50%x50% imagen.extensión

si queremos aumentar las dimensiones en, por ejemplo, un 30% mas

$ mogrify -geometry 130%x130% imagen.extensión

Para aumentar el ancho en un 40% y a la vez disminuir el alto de un 40%

$ mogrify -geometry 140%x40% imagen.extensión

para rotar una imagen de 90 grados

$ mogrify -rotate 90 imagen.extensión

mogrify con el parámetro -flip da vuelta la imagen verticalmente, poniéndola patas para arriba

$ mogrify -flip imagen.extension

mogrify con el parametro -flop da vuelta la imagen horizontalmente, como si la mirásemos a través de un espejo

$ mogrify -flop imagen.extensión

4.Usos complejos

Podemos también dar vuelta una imagen y renombrarla al mismo tiempo, utilizando otro de los comandos disponibles: convert , por ejemplo asi:

$ convert -flip cumple_camila4.jpg cami_come_torta.jpg

Y así hay infinidad de usos. Con mogrify , para pasar una foto a colores en blanco y negro (con escala de grises) ejecutamos

$ mogrify -colorspace gray imagen.extension

Pero si queremos hacer lo mismo pero conservando la foto original utilizamos convert así:

$ convert -colorspace gray foto_original.jpg foto_byn.jpg

es decir que la debemos renombrar para que no sustituya a al original.

Y ahora podemos aventurarnos aún mas, por ejemplo, agregándole un borde a una imagen

$ mogrify -border 5x5 imagen.extensión

o ponerle un marco de 10 pixeles de color amrillo

$ mogrify -frame 10x10 bordercolor yellow imagen.extensión

ó mejor aun, podemos tomar todas las imágenes presentes en el directorio, agregarles un borde de 20x20 amarillo y escribirles debajo a la derecha nuestro nickname con la fuente courier en tamaño 12 y de color rojo ejecutando

$ mogrify -border 20x20 -bordercolor yellow -gravity SouthEast -font courier -pointsize 16 -fill red -draw 'text 15,10 "bersil"' *.jpg

NOTA: téngase presente que para lograr esto mismo pero conservando los originales se debe usar el comando "convert" en lugar de "mogrify" y se debe agregar al final del comando el nombre y la extensión del archivo resultante (si es una sola imagen a procesar) o solo la extensión (si se procesan varios archivos a la vez) pudiendo esta ser igual a la de origen si se quiere.
Ejemplo:

$ mogrify -border 20x20 -bordercolor yellow -gravity SouthEast -font courier -pointsize 16 -fill red -draw 'text 15,10 "bersil"' foto_mia.jpg foto_mia_modificada.jpg

Algo divertido es que con el comando "convert" podemos crear, en un click, un simpático logo y, por supuesto, desde la terminal con, por ejemplo, este comando:

$ convert -size 310x70 xc:transparent -font Bookman-DemiItalic -pointsize 72 -draw "text 25,60 'bersil'" -gaussian 0x6 -fill yellow -stroke black -draw "text 20,55 'bersil'" logobersil.png

Obviamente, especificando una fuente diferente (Time-Bold o Helvetica-Bold, por ejemplo) podemos cambiar el aspecto de nuestro logo.

Otros comandos potentisimos son "montage" y "combine"

con "montage" podemos ponerle una sombra sobre un fondo gris, por ejemplo, de este modo

$ montage imagen.jpg -background gray -geometry +10+10 -shadow imagen_con_sombra.jpg

Ó crear un montaje de varias imagenes en una sola convirtiendo a la vez, la resultante al formato .png

$ montage img1.jpg img2.jpg img3.jpg img4.jpg img5.jpg img6.jpg img7.jpg img8.jpg collage.png

Para fundir 2 imagenes en una que llamaremos fusion podemos usar "combine" asi

$ combine imagen1.jpg imagen2.jpg fusione.jpg

Para hacer lo mismo pero asignandole un porcentaje de fusion a la segunda respecto de la primera lo hariamos con el parametro -blend + el porcentaje deseado en numeros (70 % en este ejemplo)

$ combine -blend 70 imagen1.jpg imagen2.jpg fusione.jpg

Imagemagick soporta una impresionante cantidad de formatos y las conversiones se logran con una gran facilidad, el siguiente comando convierte una imagen.png en una imagen.jpg

$ convert imagen.png imagen.jpg

el mismo resultado se obtiene utilizando mogrify con el parametro -format

$ mogrify -format jpg imagen.png

y si quisieramos convertir las imagenes de todo el directorio

$ mogrify -format jpg *.png

Creando animaciones desde la consola

Como si todo lo dicho hasta ahora fuera poco, tambien es posible crear imagenes animadas con un solo comando

Para crear un gif animado a partir de una serie de imagenes con el mismo nombre y numeradas secuencialmente (en este caso con un retraso de 15 milisegundos entre cada imagen) hacemos

$ convert -delay 15 nombre_imagen(sin el numero)*.jpg nombre_imagen_resultante.gif

y si queremos hacerlo con todas las imagenes del directorio

$ convert -delay 15 *.jpg nombre_imagen_resultante.gif

alternativamente podemos agregar el parámetro "-loop" seguido del número de veces que queremos que se repita la animación, el valor 0 hace que esta se repita sin límite.

Por ultimo, el comando "display" es esencialmente un visualizador de imagenes, pero si una vez lanzado dicho visualizador hacemos un click en èl se abre una interfaz grafica desde la cual podemos acceder a las opciones de Imagemagick.

Para ver una imagen:

$ display immagine.jpg

El comando "import" sirve para fotografiar nuestro monitor (tal como lo hacemos con "scrot" o "ksnapshot"). Para fotografiar solo una ventana de las que tengamos abiertas ejecutamos

$ import nombre_que_queramos.jpg

veremos que el puntero se convierte en una cruz y clicamos en la ventana que queremos fotografiar (no es necesario que la misma este en primer plano)

Si queremos capturar toda la pantalla hacemos

$ import -window root nombre_que_queramos.jpg

5.Notas

Nota 1: Los comandos que inician con $ se ejecutan como usuario normal; los que inician con #, como usuario administrador (root).

Nota 2: Todos los comandos y parametros deben escribirse en ingles.

Nota 3: Se recomienda siempre hacer copia de las imagenes a modificar y trabajar sobre ellas, y una vez obtenido el resultado deseado, si se quiere, eliminar los originales.

Nota 4: Todo lo aqui explicado se puede hacer tambien con "Graphicsmagick" que es una aplicacion que intenta ser una alternativa a Imagemagick pero un poco mas veloz, aunque en algunos comandos cambia un poco la sintaxis. Para informacion detallada consultar la pagina oficial elencada en el apartado "Fuentes y enlaces".

Existen muchisimas posibilidades mas como por ejemplo crear secuencias de diapositivas, escribir frases dentro de las imagenes, obtener informacion detallada acerca de una imagen, etc. etc. pero para eso lo mejor es experimentar y leer los enlaces que dejo mas abajo.

6.Fuentes y enlaces

www.imagemagick.org
www.toonik.blogspot.com
www.imagemagick.org/script/convert.php
www.simotrone.it/2007/10/09/console-convert-e-hdparm
www.graphicsmagick.org