Saltar al contenido

tput setaf tabla de colores? ¿Cómo determinar los códigos de color?

Después de de una prolongada recopilación de datos solucionamos este inconveniente que presentan ciertos los lectores. Te regalamos la respuesta y nuestro deseo es serte de mucha apoyo.

Solución:

El recuento de colores disponibles para tput viene dado por tput colors.

Para ver los 8 colores básicos (como los usa setf en la terminal urxvt y setaf en xterm terminal):

$ printf ' e[%sm▒' 30..37 0; echo           ### foreground
$ printf 'e[%sm ' 40..47 0; echo           ### background

And usually named as this:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

To see the extended 256 colors (as used by setaf in urxvt):

$ printf 'e[48;5;%dm ' 0..255; printf 'e[0m n'

If you want numbers and an ordered output:

#!/bin/bash
color()
    for c; do
        printf 'e[48;5;%dm%03d' $c $c
    done
    printf 'e[0m n'


IFS=$' tn'
color 0..15
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color 232..255

256 color chart in sequence, labeled with their index


The 16 million colors need quite a bit of code (some consoles can not show this).
The basics is:

fb=3;r=255;g=1;b=1;printf 'e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fb is front/back or 3/4.

A simple test of your console capacity to present so many colors is:

for r in 200..255..5; do fb=4;g=1;b=1;printf 'e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

red line, fading from darker to lighter (left-to-right)
It will present a red line with a very small change in tone from left to right. If that small change is visible, your console is capable of 16 million colors.

Each r, g, and b is a value from 0 to 255 for RGB (Red,Green,Blue).

If your console type support this, this code will create a color table:

mode2header()
    #### For 16 Million colors use e[0;38;2;R;G;Bm each RGB is 0..255
    printf 'e[mRn' # reset the colors.
    printf 'ne[m%59sn' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf 'e[m%59sn'   "for the ansi option: e[0;38;2;r;g;bm or e[0;48;2;r;g;bm :"

mode2colors()
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]]&& fb = 4 muestras locales = (0 63 127 191 255) para r en "$ muestras[@] "; hacer para g en" $ muestras[@] "; hazlo para b en" $ muestras[@] "; hacer printf ' e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf 'e[mn'
        done; printf 'e[m'
    done; printf 'e[mResetn'

mode2header
mode2colors 3
mode2colors 4

chart of sample foreground colors with their index as labels

chart of sample background colors with their index as labels

To convert an hex color value to a (nearest) 0-255 color index:

fromhex()
    hex=$1#"#"
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' $hex#??)
    b=$(printf '0x%0.2s' $hex#????)
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"

Use it as:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

To find the color number as used in HTML colors format:

#!/bin/dash
tohex()
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ];  entonces bas = $ ((dec% 16)) mul = 128
        [ "$bas" -eq "7" ] && mul = 192
        [ "$bas" -eq "8" ] && bas = 7
        [ "$bas" -gt "8" ] && mul = 255 a = "$ (((bas & 1) * mul))" b = "$ ((((bas & 2) >> 1) * mul))" c = "$ ((((bas & 4) >> 2 ) * mul)) "printf 'dec =% 3s basic = #% 02x% 02x% 02x  n'" $ dec "" $ a "" $ b "" $ c "elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ];  entonces b = $ (((dic-16)% 6));  b = $ ((b == 0? 0: b * 40 + 55)) g = $ (((dic-16) / 6% 6));  g = $ ((g == 0? 0: g * 40 + 55)) r = $ (((16-dic) / 36));  r = $ ((r == 0? 0: r * 40 + 55)) printf 'dec =% 3s color = #% 02x% 02x% 02x  n' "$ dec" "$ r" "$ g" " $ b "más gris = $ (((dec-232) * 10 + 8)) printf 'dec =% 3s gris = #% 02x% 02x% 02x  n'" $ dec "" $ gris "" $ gris " "$ gris" fi para i en $ (seq 0 255);  hacer tohex $ i hecho

Úselo como ("básico" son los primeros 16 colores, "color" es el grupo principal, "gris" son los últimos colores grises):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

los tput La utilidad está utilizando una tabla de búsqueda de 256 colores para imprimir secuencias de escape ANSI de 8 bits (comenzando con Esc y [) que hace uso de las capacidades del terminal, por lo que estas secuencias de control se pueden interpretar como colores. Se trata de un conjunto predefinido de 256 colores que se utilizan comúnmente en las tarjetas gráficas.

Para imprimir los 256 colores en el terminal, pruebe el siguiente de una sola línea:

for c in 0..255; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

Sugerencia: anexar | column para columnate lista.

Esta tabla de búsqueda de 256 colores también se puede encontrar en la página de Wikipedia de la siguiente manera:

Gráfico;  Código de escape ANSI;  Tabla de búsqueda de 8 bits y 256 colores en Wikipedia;  Modo de 256 colores - primer plano: ESC[38;5;#mfondo:ESC[48;5;#m[38;5;#mbackground:ESC[48;5;#m

La respuesta corta es que puede encontrar tablas de colores en la web y hacerlas coincidir con el número de color.

La respuesta larga es que el mapeo correcto depende del terminal:

los 125 es un parámetro de una secuencia de escape denominada setaf en la descripción del terminal. tput no concede un significado particular al número. Eso realmente depende del emulador de terminal en particular.

Hace un tiempo, ANSI definió códigos para 8 colores, y había dos esquemas para numerarlos. Los dos se ven en algunas descripciones de terminales como los pares setf/setb o setaf/setab. Dado que este último tiene la connotación de "colores ANSI", verá que se usa con más frecuencia. El primero (setf / setb) cambió el orden de rojo / azul como se indica en las preguntas frecuentes de ncurses ¿Por qué se intercambian rojo / azul?, pero en cualquier caso, el esquema se estableció solo para numerar los colores. No existe una relación predefinida entre esos números y el contenido RGB.

Para emuladores de terminal específicos, hay paletas de colores predefinidas que se pueden enumerar con bastante facilidad y se pueden programar utilizando estas secuencias de escape. Existen no estándares relevantes, y verá diferencias entre los emuladores de terminal, como se indica en las preguntas frecuentes de xterm No me gusta ese tono de azul.

Sin embargo, la convención a menudo se confunde con los estándares. En el desarrollo de xterm durante los últimos 20 años, incorporó colores ANSI (8), adaptó el aixterm cuentan con (16) colores, extensiones agregadas para 88 y 256 colores. Mucho de eso ha sido adoptado por otros desarrolladores para diferentes emuladores de terminal. Eso se resume en las preguntas frecuentes de xterm ¿Por qué no equiparar "xterm" con "xterm-256color"?.

El código fuente de xterm incluye scripts para demostrar los colores, por ejemplo, usando las mismas secuencias de escape que tput usaría.

También puede encontrar útil esta pregunta / respuesta: Valores RGB de los colores en el índice de colores extendido Ansi (17-255)

Si entiendes que te ha resultado de utilidad este artículo, agradeceríamos que lo compartas con otros entusiastas de la programación así contrubuyes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *