ImageMagick cuenta con una serie de colores predefinidos a los que podemos llamar por su nombre en lugar de por su código hexadecimal. Es más cómodo invocarlos por su nombre, aunque es más preciso hacerlo por su código. Así que cada uno que elija lo que más le interese, aunque en este artículo nos vamos a centrar en los colores preestablecidos y cómo sacarle partido a este listado.
Saber los colores predefinidos con los que podemos trabajar
Para poder listar en ImageMagick está el parámetro -list.
convert -list $listaamostrar
Nos mostrará la lista que le pidamos. En este caso, le pediremos que liste los colores:
convert -list color
Y nos mostrará el listado de colores. En mi caso:
$ convert -list color | wc -l$ convert -list color | wc -l
683
Me dice que tengo 683 colores predefinidos. Con wc -l le he pedido que me diga únicamente las líneas del listado, no el listado en sí, y así sé el número de colores que tengo.
Saber los tonos de un determinado color
Si quiero saber los distintos colores predefinidos basados en un determinado color, lo que puedo hacer es redirigir la salida del listado a un grep e indicarle el patrón. Veamos cómo listar las tonalidades de rojo que tengo:
convert -list color | grep Redconvert -list color | grep Red
DarkRed srgb(139,0,0) SVG X11
IndianRed srgb(205,92,92) SVG X11 XPM
IndianRed1 srgb(255,106,106) X11
IndianRed2 srgb(238,99,99) X11
IndianRed3 srgb(205,85,85) X11
IndianRed4 srgb(139,58,58) X11
MediumVioletRed srgb(199,21,133) SVG X11 XPM
OrangeRed srgb(255,69,0) SVG X11 XPM
OrangeRed1 srgb(255,69,0) X11
OrangeRed2 srgb(238,64,0) X11
OrangeRed3 srgb(205,55,0) X11
OrangeRed4 srgb(139,37,0) X11
PaleVioletRed srgb(219,112,147) SVG X11 XPM
PaleVioletRed1 srgb(255,130,171) X11
PaleVioletRed2 srgb(238,121,159) X11
PaleVioletRed3 srgb(205,104,137) X11
PaleVioletRed4 srgb(139,71,93) X11
VioletRed srgb(208,32,144) X11 XPM
VioletRed1 srgb(255,62,150) X11
VioletRed2 srgb(238,58,140) X11
VioletRed3 srgb(205,50,120) X11
VioletRed4 srgb(139,34,82) X11
Pero vemos que esto es un listado con tres columnas y que me da más información que la que voy a usar a la hora de invocar un color, ya que para esto, utilizaré únicamente el nombre. Así que limpiaré el listado y me quedaré con la primera columna que es la que me interesa:
convert -list color | grep Red | cut -f 1 -d " "
DarkRed
IndianRed
IndianRed1
IndianRed2
IndianRed3
IndianRed4
MediumVioletRed
OrangeRed
OrangeRed1
OrangeRed2
OrangeRed3
OrangeRed4
PaleVioletRed
PaleVioletRed1
PaleVioletRed2
PaleVioletRed3
PaleVioletRed4
VioletRed
VioletRed1
VioletRed2
VioletRed3
VioletRed4
Así ya podemos ver el listado limpio y podemos trabajar con esos valores
Recorrer el listado de colores
En muchas ocasiones nos interesa utilizar distintos tonos de un color, por ejemplo, para dar ir cambiando la tonalidad de una imagen. Para ello, una vez que tenemos el listado limpio, únicamente tenemos que recorrerlo con un for:
function hazlienzosdecolor()
{
for i in $(convert -list color | grep Red | cut -f 1 -d " ")
do
#Instrucciones
done
}
Supongamos que queremos hacer una serie de lienzos de un tamaño determinado basados en un color que le pasemos como parámetro. Podríamos hacer un script como este:
#!/bin/bash
tamlienzo="200x100"
let numlienzo=0
function hazlienzosdecolor()
{
if [ $1 ] && [ "$(convert -list color | grep $1 | cut -f 1 -d " ")" ]
then
for i in $(convert -list color | grep $1 | cut -f 1 -d " ")
do
destino="lienzo"$1$numlienzo".png"
convert -size $tamlienzo xc:$i $destino
let numlienzo++
done
fi
}
hazlienzosdecolor $1
Y al ejecutarlo, genera:
./hazlienzosdecolor Orange
Qué hemos hecho en este script:
Primero indicamos las variables, de esta forma, si queremos modificarlas en cualquier momento, las tenemos localizadas a simple vista
Después le decimos que si al ejecutarse el script recibe un parámetro ([ $1 ]), y además (&&) este es un color válido ([ "$(convert -list color | grep $1 | cut -f 1 -d " ")" ]) ejecute estas órdenes:
for i in $(convert -list color | grep $1 | cut -f 1 -d " ")-> Recorre el listado de los colores que contengan el valor indicado en el primer parámetro y únicamente el primer campo del listado
destino="lienzo"$1$numlienzo".png" -> Da valor a la variable destino con una cadena de texto, en este caso el patrón "lienzo", luego el nombre el color que ha indicado el usuario, el número que corresponde a ese lienzo y la extensión ".png"
convert -size $tamlienzo xc:$i $destino -> Genera el lienzo
let numlienzo++ -> Suma uno a la variable numlienzo para que el siguiente lienzo a crear tenga el próximo número correlativo.
Seleccionar un color de forma aleatoria
Para seleccionar un color aleatorio, no le indicaremos un patrón (quitamos el grep $1) y lo que tenemos que indicarle al listado generado es que lo desordene y muestre sólo un color, que se lo indicaremos con shuf -n 1:convert -list color | cut -f 1 -d " " | shuf -n 1
Y si lo queremos usar en un script para que una variable recoja ese color aleatorio, podemos hacer:
#!/bin/bash
function coloraleatorio()
{
color=$(convert -list color | cut -f 1 -d " " | shuf -n 1)
echo $color
}
color=$(coloraleatorio)
echo $color
Puede parecer excesivo hacer una función para algo tan sencillo, pero cuando estás generando muchos colores aleatorios al cabo del día, se agradece tener funciones creadas ;)
Me encanta cuando scripteas las cosas, así luego es mucho más fácil reutilizar cosas y trozos de código. Te dejo una cosilla porque yo soy muy despistado, para la función hazlienzosdecolor():
convert -size $tamlienzo xc:$i -gravity Center -weight 100 -pointsize $fontsize -fill white -annotate 0 "$i" $destino
Y al principio, para ser más automáticos, fontsize lo podemos generar así:
fontsize=$(echo "$tam/1000" | sed 's/x/*/' | bc)
Aunque creo que me he complicado un poco la vida, pero a mi me va bien
Enhorabuena por el tutorial!!!