首页 > 解决方案 > 如何获取 256 色调色板终端颜色的 RGB 值

问题描述

感谢ANSI 转义码,当您运行时:

echo -e "\e[38;5;74mHi"

这将显示“Hi”,用调色板颜色着色74(通常是蓝色/青色,但它可能是另一种颜色,取决于定义的调色板):

回显命令

但是如何检索74终端仿真器实际显示的给定颜色(在本例中)的红/绿/蓝分量?

预期结果

在 bash 中运行这个虚构的命令:

$ palette-to-rgb 74

预期输出:

#5fafd7      # Or any other parsable output like rgb(95,175,215)

我尝试了什么

我发现获取 RGB 组件的唯一(丑陋)方法是制作屏幕截图并使用一些图形程序(如 gimp)来检索 RGB 值。

标签: terminalrgbansi-colors

解决方案


我认为不可能以编程方式检索颜色代码。一种可能的方法是一种 ANSI 序列,但它似乎不存在。

因此,作为一种解决方法,可以获得标准值;我为此目的制作了这个 bash 脚本(对于 int 计算,我从st的来源获得了帮助):

#!/bin/bash

usage() {
    echo "palette-to-rgb [COL] [-rgb] [-raw] [-C] [-h]"
    echo "Show RGB values of the standard terminal 256-color palette."
    echo "If COL is given (number 0-255), show only the given color."
    echo "Options:"
    echo "  -rgb  Format as \"rgb(R, G, B)\" instead of \"#RRGGBB\""
    echo "  -raw  Show the value only"
    echo "  -C    Force coloring even when piped"
}

std_colors=(
    0   0   0    #  0 black
    128 0   0    #  1 red
    0   128 0    #  2 green
    128 128 0    #  3 yellow
    0   0   128  #  4 blue
    128 0   128  #  5 magenta
    0   128 128  #  6 cyan
    192 192 192  #  7 white (light grey)
    128 128 128  #  8 grey
    255 0   0    #  9 bright red
    255 255 0    # 10 bright green
    0   255 0    # 11 bright yellow
    0   0   255  # 12 bright blue
    255 0   255  # 13 bright magenta
    0   255 255  # 14 bright cyan
    255 255 255  # 15 bright white
)

# 6x6x6 cube color component
cube_component() {
    local i=$(( (($1 - 16) / $2) % 6 ))
    (( $i == 0 )) && echo 0 || echo $(( ( 14135 + 10280 * $i ) / 256 ))
}

get_color() {
    local r g b fmt
    if (( $1 < 16 )); then
        r=${std_colors[$(( $1 * 3 + 0 ))]}
        g=${std_colors[$(( $1 * 3 + 1 ))]}
        b=${std_colors[$(( $1 * 3 + 2 ))]}
    elif (( $1 < 232 )); then # < 6*6*6+16 ?
        # colors 16-231 (6x6x6 cube):
        r=$(cube_component $1 36)
        g=$(cube_component $1 6)
        b=$(cube_component $1 1)
    else
        # colors 232-255 (grayscale):
        r=$(( ( 2056 + 2570 * ($1 - 232) ) / 256 ))
        g=$r
        b=$r
    fi
    [[ -n $rgb ]] && fmt='rgb(%i, %i, %i)' || fmt='#%02x%02x%02x'
    printf "$fmt\n" $r $g $b
}

print_color() {
    if [[ -n $raw ]]; then
        get_color $1
    else
        # Show a colored box if not piped (or with option -C)
        [[ -t 1 || -n $colored ]] && echo -en "\e[48;5;${1}m  \e[0m "
        printf '%03i: %s\n' $1 "$(get_color $1)"
    fi
}

color= colored= rgb= raw=
for arg in "$@"; do
    if [[ $arg == -h ]]; then usage; exit
    elif [[ $arg =~ ^[0-9]+$ ]]; then
        (( $arg > 255 )) && { echo "Wrong color code" >&2; exit 1; }
        color=$arg
    elif [[ $arg == -C ]]; then colored=1
    elif [[ $arg == -rgb ]]; then rgb=1
    elif [[ $arg == -raw ]]; then raw=1
    else echo "Wrong arg: $arg" >&2; exit 1
    fi
done

if [[ -n $color ]]; then
    print_color $color
else
    for n in {0..255}; do
        print_color $n
    done
fi

输出:

000: #000000
001: #800000
002: #008000
003: #808000
004: #000080
005: #800080
006: #008080
007: #c0c0c0
008: #808080
009: #ff0000
010: #ffff00
011: #00ff00
012: #0000ff
013: #ff00ff
014: #00ffff
015: #ffffff
016: #000000
017: #00005f
018: #000087
019: #0000af
020: #0000d7
021: #0000ff
022: #005f00
023: #005f5f
024: #005f87
025: #005faf
026: #005fd7
027: #005fff
028: #008700
029: #00875f
030: #008787
031: #0087af
032: #0087d7
033: #0087ff
034: #00af00
035: #00af5f
036: #00af87
037: #00afaf
038: #00afd7
039: #00afff
040: #00d700
041: #00d75f
042: #00d787
043: #00d7af
044: #00d7d7
045: #00d7ff
046: #00ff00
047: #00ff5f
048: #00ff87
049: #00ffaf
050: #00ffd7
051: #00ffff
052: #5f0000
053: #5f005f
054: #5f0087
055: #5f00af
056: #5f00d7
057: #5f00ff
058: #5f5f00
059: #5f5f5f
060: #5f5f87
061: #5f5faf
062: #5f5fd7
063: #5f5fff
064: #5f8700
065: #5f875f
066: #5f8787
067: #5f87af
068: #5f87d7
069: #5f87ff
070: #5faf00
071: #5faf5f
072: #5faf87
073: #5fafaf
074: #5fafd7
075: #5fafff
076: #5fd700
077: #5fd75f
078: #5fd787
079: #5fd7af
080: #5fd7d7
081: #5fd7ff
082: #5fff00
083: #5fff5f
084: #5fff87
085: #5fffaf
086: #5fffd7
087: #5fffff
088: #870000
089: #87005f
090: #870087
091: #8700af
092: #8700d7
093: #8700ff
094: #875f00
095: #875f5f
096: #875f87
097: #875faf
098: #875fd7
099: #875fff
100: #878700
101: #87875f
102: #878787
103: #8787af
104: #8787d7
105: #8787ff
106: #87af00
107: #87af5f
108: #87af87
109: #87afaf
110: #87afd7
111: #87afff
112: #87d700
113: #87d75f
114: #87d787
115: #87d7af
116: #87d7d7
117: #87d7ff
118: #87ff00
119: #87ff5f
120: #87ff87
121: #87ffaf
122: #87ffd7
123: #87ffff
124: #af0000
125: #af005f
126: #af0087
127: #af00af
128: #af00d7
129: #af00ff
130: #af5f00
131: #af5f5f
132: #af5f87
133: #af5faf
134: #af5fd7
135: #af5fff
136: #af8700
137: #af875f
138: #af8787
139: #af87af
140: #af87d7
141: #af87ff
142: #afaf00
143: #afaf5f
144: #afaf87
145: #afafaf
146: #afafd7
147: #afafff
148: #afd700
149: #afd75f
150: #afd787
151: #afd7af
152: #afd7d7
153: #afd7ff
154: #afff00
155: #afff5f
156: #afff87
157: #afffaf
158: #afffd7
159: #afffff
160: #d70000
161: #d7005f
162: #d70087
163: #d700af
164: #d700d7
165: #d700ff
166: #d75f00
167: #d75f5f
168: #d75f87
169: #d75faf
170: #d75fd7
171: #d75fff
172: #d78700
173: #d7875f
174: #d78787
175: #d787af
176: #d787d7
177: #d787ff
178: #d7af00
179: #d7af5f
180: #d7af87
181: #d7afaf
182: #d7afd7
183: #d7afff
184: #d7d700
185: #d7d75f
186: #d7d787
187: #d7d7af
188: #d7d7d7
189: #d7d7ff
190: #d7ff00
191: #d7ff5f
192: #d7ff87
193: #d7ffaf
194: #d7ffd7
195: #d7ffff
196: #ff0000
197: #ff005f
198: #ff0087
199: #ff00af
200: #ff00d7
201: #ff00ff
202: #ff5f00
203: #ff5f5f
204: #ff5f87
205: #ff5faf
206: #ff5fd7
207: #ff5fff
208: #ff8700
209: #ff875f
210: #ff8787
211: #ff87af
212: #ff87d7
213: #ff87ff
214: #ffaf00
215: #ffaf5f
216: #ffaf87
217: #ffafaf
218: #ffafd7
219: #ffafff
220: #ffd700
221: #ffd75f
222: #ffd787
223: #ffd7af
224: #ffd7d7
225: #ffd7ff
226: #ffff00
227: #ffff5f
228: #ffff87
229: #ffffaf
230: #ffffd7
231: #ffffff
232: #080808
233: #121212
234: #1c1c1c
235: #262626
236: #303030
237: #3a3a3a
238: #444444
239: #4e4e4e
240: #585858
241: #626262
242: #6c6c6c
243: #767676
244: #808080
245: #8a8a8a
246: #949494
247: #9e9e9e
248: #a8a8a8
249: #b2b2b2
250: #bcbcbc
251: #c6c6c6
252: #d0d0d0
253: #dadada
254: #e4e4e4
255: #eeeeee

一个相关问题:How to generate 256 color palette for Linux terminal in HTML/jquery


推荐阅读