Jueves, 02 Agosto 2018 20:35

Los colores predefinidos en ImageMagick

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

lienzoOrange0.pnglienzoOrange9.pnglienzoOrange8.pnglienzoOrange7.pnglienzoOrange6.pnglienzoOrange5.pnglienzoOrange4.pnglienzoOrange3.pnglienzoOrange2.pnglienzoOrange1.png

 

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 ;)

Publicado en Multimedia

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso. Saber más

Acepto

Vea nuestra política de cookies y enlaces de interés aquí