Rotar imágenes con ImageMagick
En este artículo vamos a ver cómo rotar una fotografía con ImageMagick que lleva una operatoria similar que rotar un texto, pero las características de la imagen son diferentes ya que, al rotar una imagen, quedan unos espacios en las esquinas.
Tomaremos como base esta fotografía:
Y vamos a ver cómo hacer una rotación simple con un valor alto para que se vea bien el efecto.
Con un valor positivo, inclina la parte derecha de la imagen hacia abajo:
convert puente_almozara.jpg -rotate 20 puente_almozara_rotate_20.jpg
Y con un valor negativo, inclina la parte derecha de la imagen hacia arriba:
convert puente_almozara.jpg -rotate -20 puente_almozara_rotate_-20.jpg
En ambos casos, ha generado un fondo blanco detrás de la imagen rotada. Para verlo mejor, podemos cambiar el color del fondo. Por ejemplo, con un fondo rojo destacará más:
convert puente_almozara.jpg -background Red -rotate 20 puente_almozara_rotate_20_red.jpg
O, si usamos un formato que admita transparencia, como png, podemos ponerle un fondo transparente:
convert puente_almozara.jpg -background Transparent -rotate 20 puente_almozara_rotate_20_transparent.png
Aunque en web no vemos que el fondo es transparente, si abrimos con GIMP podemos ver los cuadritos típicos de los fondos transparentes:
Ahora que ya hemos visto cómo hacer una rotación simple, vamos a ayudarnos de identify para saber el tamaño de la imagen original y así poder ajustar con -extent la imagen generada al tamaño de la original:
#!/bin/bash width=$(identify -format %w $1) heigh=$(identify -format %h $1) new_width=$(bc <<< "scale=0; $width*1.3") convert $1 -resize ${new_width%%.*}x -rotate 10 -gravity Center -extent ${width}x$heigh ${1%%.*}_rotate.${1##*.}
Analicemos paso a paso:
width=$(identify -format %w $1)
y heigh=$(identify -format %h $1)
: extrae el tamaño de la imagen pasada como parámetro.*
new_width=$(bc <<< "scale=0; $width*1.3")
: Multiplica el la anchura de la imagen por 1.3 para luego escalarla (como si escalásemos con -resize 130%)
convert $1 -resize ${new_width%%.*}x
: escala la imagen al tamaño indicado tomando como referencia la anchura.
-rotate 10
: rota 10 grados la imagen.
-gravity Center
: toma como referencia el centro de la imagen para el siguiente operador.
-extent ${width}x$heigh
: recorta la imagen girada al tamaño de la imagen original.
${1%%.*}_rotate.${1##*.}
: separa el nombre de fichero y su extensión, insertándole entre los mismos la cadena «_rotate.».
Y ahora, vamos a ver el resultado:
*.- Sí, deberíamos comprobar que realmente el script recibe un parámetro y que este es un fichero de imagen, pero este es un artículo sobre el modificador -rotate de ImageMagick.