Imprimir esta página

Los colores predefinidos en ImageMagick

02 Agosto 2018 by 3 comentarios Multimedia 1311 Views
Los colores predefinidos en ImageMagick
Valora este artículo
(0 votos)

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

Información adicional

  • Nivel de dificultad: Bajo
  • ¿Tutorial sacado de otra web/foro?: No

3 comentarios

  • Gaspar Fernández
    Gaspar Fernández Sábado, 11 Agosto 2018 18:57

    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!!!

  • ¿Hacemos una Webserie?
    ¿Hacemos una Webserie? Domingo, 12 Agosto 2018 22:05

    Gracias, Gaspar.

    Me convenciste con el GitLab y ahora pendiente colgar los scripts ahí al estilo Fred (http://www.fmwconcepts.com/imagemagick/index.php). Pero de momento quiero publicar más tutoriales con conceptos básicos para evitar tentaciones como la que has tenido (y que yo también tengo a diario) de "correr antes de andar".

    Muy buena tu aportación, ya que viene de maravilla anotar los colores o los parámetros para hacer algún efecto en la propia imagen. Así puedes hacer catálogos en los que, de un golpe de vista, ves el resultado y el camino. Pero yo mismo me censuro de hacer cosas más avanzadas, ya que todavía no he publicado ningún tutorial sobre cómo escribir textos en las imágenes. Realmente no he publicado nada sobre textos, por lo que no quiero incluir textos en imágenes hasta no haber explicado esos conceptos.

    Y ojo, que el deseo de incluir cosas más avanzadas siempre está ahí. Por ejemplo, combinar imágenes, pero hasta que no hable de máscaras, de métodos de composición, de "average" y de "combine", no quiero utilizar estos parámetros. Pero para hablar de ellos, hay que hablar previamente de geometria y de gravedad.

    De momento, quiero ir publicando artículos cortos, sencillos de entender, que cualquiera pueda probarlos en casa y adaptarlos a sus necesidades y, poco a poco, una vez que los conceptos más básicos estén explicados, ir aumentando la complejidad de los scripts, consiguiendo mayor utilidad, como tu aportación de escribir el nombre al lienzo o mayor efectismo visual, haciendo efectos chulos como los que hay gran cantidad de tutoriales de GIMP o de otros programas gráficos, pero no hay de ImageMagick. Y eso que es mucho más cómodo ejecutar un script con IM que tener que ajustar niveles, curvas, crear capas, aplicarles a cada una unos efectos, combinarlas... en programas gráficos.

  • Gaspar Fernández
    Gaspar Fernández Lunes, 13 Agosto 2018 17:47

    Ya tengo ganas de ver los demás. Al menos te vas a convertir en una gran fuente de conocimiento de ImageMagick en español. :)