Crear un lienzo uniendo colores vertical y horizontalmente con ImageMagick
Con ImageMagick podemos crear lienzos de colores uniformes, con degradados, uniendo franjas… pero cuando queremos unir lienzos horizontalmente y luego verticalmente con append a veces resulta un poco lioso. Hasta que descubres el truco, que es de lo que voy a hablar en este artículo.
Vamos a intentar hacer un lienzo uniendo cuatro lienzos más pequeños: uno rojo, otro verde, otro azul y otro negro. Vamos a intentar (para ver cómo lo que aparentemente intuitivo da error) crear dos lienzos, unirlos verticalmente con +append, otros dos lienzos, volver a unirlos verticalmente y luego unir horizontalmente los dos lienzos:
convert -size 200x200 xc:red xc:green +append xc:blue xc:black +append -append prueba_cuadros.jpg
El problema es que no crea el resultado deseado sino que une horizontalmente todos los lienzos:
Como de esa manera no podemos unir los cuatro lienzos en filas de dos en dos, lo que podemos hacer es crear individualmente las dos filas y luego unirlas:
convert -size 200x200 xc:red xc:green +append fila_superior.jpg convert -size 200x200 xc:blue xc:black +append fila_inferior.jpg convert fila_superior.jpg fila_inferior.jpg -append cuatro_cuadros.jpg
El resultado final será el resultado esperado:
Pero nos encontramos con varias cuestiones que son mejorables:
- Hemos necesitado tres instrucciones en lugar de una.
- Ha generado dos imágenes que deberíamos borrar:
Y:
Así que vamos a mejorar la instrucción. Para ello agruparemos cada una de las filas entre paréntesis. Y el resultado de ambas filas lo unimos con -append. Pero hemos de escapar los paréntesis, si no, nos dará un error como este:
$ convert -size 200x200 (xc:red xc:green +append) (xc:blue xc:black +append) -append cuadros.jpg bash: error sintáctico cerca del elemento inesperado `('
Así que tenemos que escapar cada uno de los paréntesis que vayamos a usar:
convert -size 200x200 \( xc:red xc:green +append \) \( xc:blue xc:black +append \) -append cuadros.jpg
Y así, ya tenemos una imagen formada por distintos lienzos unidos horizontal y verticalmente.
Hemos visto una imagen formada por cuatro cuadros iguales. Pero podemos hacer que cada lienzo sea de un tamaño distinto. Para ello, sólo tenemos que definir un bloque de -size y xc: por cada lienzo, manteniendo entre paréntesis cada una de las filas:
convert \( -size 266x222 xc:red -size 267x222 xc:green -size 266x222 xc:blue +append \) \( -size 400x223 xc:white -size 400x223 xc:black +append \) -append cinco_colores.jpg
Pingback: Clonar una imagen para crear un mosaico con ImageMagick – Linux en Español