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):
Ahora que ya tenemos la imagen original, vamos a duplicarla horizontalmente:
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
Para crear un mosaico de 2×2 teselas, podemos unir los dos comandos anteriores:
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
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
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
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
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
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
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
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
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
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.