Clonar una imagen para crear un mosaico con ImageMagick

En este artículo vamos a ver cómo crear un mosaico a partir de una imagen con ImageMagick. Incluso, cómo modificar esa imagen para que el mosaico no sea totalmente uniforme. Para ello nos ayudaremos de dos operadores +clone, que duplica la imagen y +append y -append para unir las imágenes, respectivamente, horizontal y verticalmente.

Vamos a comenzar con una imagen sencilla para que se vea claramente el efecto:

convert -size 90x90 xc:LightSteelBlue -bordercolor DarkRed -border 5 tesela.jpg

Que nos genera una imagen de 100×100 píxeles (90×90 del lienzo + 5 píxeles de borde):

convert -size 90x90 xc:LightSteelBlue -bordercolor DarkRed -border 5 tesela.jpg
Ahora que ya tenemos la imagen original, vamos a duplicarla horizontalmente:

convert tesela.jpg +clone +append dos_teselas.jpg

convert tesela.jpg +clone +append dos_teselas.jpg

Nótese el doble grosor de la línea central.

Para crear el mismo efecto, pero verticalmente, lo que haremos será usar -append en lugar de +append:

convert tesela.jpg +clone -append dos_teselas_verticales.jpg

convert tesela.jpg +clone -append dos_teselas_verticales.jpg

 

Para crear un mosaico de 2×2 teselas, podemos unir los dos comandos anteriores:

convert tesela.jpg +clone -append +clone +append cuatro_teselas.jpg

convert tesela.jpg +clone -append +clone +append cuatro_teselas.jpg

Podemos modificar una tesela clonándola y modificándola, pero tendremos que volver a usar la imagen original si queremos que el resto de teselas sean como la original:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg tesela.jpg +append \) -append una_tesela_rotada.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg tesela.jpg +append \) -append una_tesela_rotada.jpg

En este ejemplo, la he rotado, pero podríamos hacerle la modificación que quisiéramos, como cambiar el color:

convert tesela.jpg \( +clone -fuzz 10% -fill Yellow -opaque LightSteelBlue \) +append \( tesela.jpg tesela.jpg +append \) -append una_tesela_amarilla.jpg

convert tesela.jpg \( +clone -fuzz 10% -fill Yellow -opaque LightSteelBlue \) +append \( tesela.jpg tesela.jpg +append \) -append una_tesela_amarilla.jpg

Es muy importante que volvamos a usar la imagen original, porque si no lo hacemos y seguimos clonando, ImageMagick clonará la imagen modificada:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( +clone  +append \) -append dos_teselas_rotadas.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( +clone +append \) -append dos_teselas_rotadas.jpg

 

Incluso, aunque le intercalemos la imagen original, que la añadirá a la imagen ya creada, por lo que en lugar de cuatro teselas, tendremos cinco:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg +clone +append \) -append cinco_teselas.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg +clone +append \) -append cinco_teselas.jpg

Entonces, ¿cómo podemos hacer un mosaico en el que haya más de un efecto? Clonando una única vez y modificando la imagen original:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append una_tesela_rotada_y_otra_amarilla.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append una_tesela_rotada_y_otra_amarilla.jpg

 

Si en este punto volvemos a clonar, lo que hará ImageMagick es clonar la imagen creada hasta ese momento:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append una_tesela_rotada_y_otra_amarilla_clonada.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append una_tesela_rotada_y_otra_amarilla_clonada.jpg

 

Y así, tantas veces como queramos, pero contando con que siempre va a clonar la imagen tal como está en ese momento. Vamos a clonar horizontalmente la imagen anterior, en la que teníamos dos cuadros amarillos, por lo que, al clonarla, deberíamos generar cuatro cuadros amarillos:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append +clone +append una_tesela_rotada_y_otra_amarilla_clonada_cuatro_veces.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append +clone +append una_tesela_rotada_y_otra_amarilla_clonada_dos_veces.jpg

Como vemos, nos ha duplicado la imagen, por lo que hemos pasado de dos cuadros amarillos a cuatro. Lo mismo ocurriría la clonamos esta imagen verticalmente, que deberíamos pasar de cuatro cuadros amarillos a ocho:

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append +clone +append +clone -append ocho_teselas_amarillas.jpg

convert tesela.jpg \( +clone -rotate 45 -gravity Center -extent 100x100 \) +append \( tesela.jpg -fuzz 10% -fill Yellow -opaque LightSteelBlue tesela.jpg +append \) -append +clone +append +clone +append +clone -append ocho_teselas_amarillas.jpg

Ahora que ya sabemos cómo clona las imágenes, podemos crear y clonar imágenes en la misma instrucción. Vamos a crear una tesela, la vamos a clonar ocho veces y la unimos horizontalmente. A partir de esa unión horizontal, vamos a clonarla tres veces y la vamos a unir verticalmente:

convert -size 90x90 xc:LightSteelBlue -bordercolor DarkRed -border 5 \( +clone +clone +clone +clone +clone +clone +clone \) +append \( +clone +clone +clone \) -append mosaico.jpg

convert -size 90x90 xc:LightSteelBlue -bordercolor DarkRed -border 5 \( +clone +clone +clone +clone +clone +clone +clone \) +append \( +clone +clone +clone \) -append mosaico.jpg

 

Ya hemos visto cómo permite ImageMagick clonar tanto imágenes ya creadas como clonar modificaciones, lo que nos ahorra mucho tiempo a la hora de crear composiciones repitiendo patrones.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.