Efecto rodillo con ImageMagick
Con el operador -roll desplazamos una determinada cantidad de píxeles a izquierda, derecha, arriba o abajo, corta esa cantidad de píxeles y los coloca en el lado opuesto. Como si tuviéramos la imagen en un rodillo y lo fuéramos girando. A medida que vamos girando el rodillo, la parte desplazada de la derecha pasa a estar en la izquierda.
Es un operador complicado de explicar con palabras, pero con imágenes lo veremos muy fácilmente. Partiremos de esta imagen:
Con el comando -roll trabajaremos con dos valores, que pueden ser positivos o negativos, pero siempre tenemos que indicar con + y con – el desplazamiento a realizar. Si no lo indicamos, nos dará un error:
$ convert grafiti.jpg -roll 0+50 grafiti_0_50.jpg convert-im6.q16: invalid argument for option `-roll': 0+50 @ error/convert.c/ConvertImageCommand/2610.
El primero de los valores es el desplazamiento horizontal, que si es positivo, desplazará hacia la derecha:
convert grafiti.jpg -roll +200+0 grafiti_200_0.jpg
Y si es negativo, desplazará hacia la izquierda:
convert grafiti.jpg -roll -200+0 grafiti_-200_0.jpg
El segundo valor es el desplazamiento vertical, con un valor positivo desplaza la imagen hacia abajo:
convert grafiti.jpg -roll +0+50 grafiti_0_50.jpg
Y con un valor negativo, desplaza la imagen hacia arriba:
convert grafiti.jpg -roll +0-50 grafiti_0_-50.jpg
Vídeos con -roll
Este operador donde tiene su aplicación más potente es a la hora de hacer vídeos y animaciones tanto con una como con varias imágenes.
Veamos cómo hacer un gif que rote una imagen:
#!/bin/bash width=$(identify -format %w $1) height=$(identify -format %h $1) step=5 for (( pos=0; pos<=$width; pos=$pos+$step )) do convert $1 -roll +$pos+0 -extent ${height}x${height} png:- done | ffmpeg -f image2pipe -i - ${1%%.*}.gif
Y generando una transición entre dos imágenes:
#!/bin/bash width=$(identify -format %w $1) height=$(identify -format %h $1) step=5 filetemp="/tmp/${1%%.*}-${2%%.*}.png" convert $1 $2 +append $filetemp for (( pos=0; pos<=$width; pos=$pos+$step )) do convert $filetemp -roll +$pos+0 -extent ${width}x${height} png:- done | ffmpeg -f image2pipe -i - ${1%%.*}-${2%%.*}.gif