gpt4 book ai didi

bash - Ansi 扩展颜色索引中颜色的 RGB 值 (17-255)

转载 作者:行者123 更新时间:2023-11-29 08:46:03 26 4
gpt4 key购买 nike

我的问题是使用 ansi 颜色的一般 shell 脚本,但作为引用,我使用的是 Apple Mac OS X 10.9 Mavericks。我使用“iTerm”终端应用程序作为我的默认终端,但也使用内置的“终端”应用程序进行检查。我使用 ZSH (5.0.7) 作为我的默认 shell,但也检查了 BASH (3.2.51)。

我一直在试图找出是否有 256 种颜色索引的扩展前景/背景 Ansi 转义码的 RGB 值列表,这些值可以使用 esc[38;5;xm 和 esc[48;5;xm,其中 x 是一个从 0 到 255 的数字。我发现了一些将颜色打印为块(使用索引)的脚本,但我想知道索引中每种颜色的 rgb 值。

这是正在使用的 ansi 代码的示例:

printf '\e[38;5;222;48;5;238m  Hi  \e[m\n'

(\e 可以替换为\033 或\x1b)

所以基本上我想知道是否有这些索引颜色的列表或商定的设置?例如 232-255 似乎总是一个灰色渐变。我发现的每个引用扩展颜色的网站几乎都只是说明了如何使用它,并没有列出任何特定的颜色。

我发现了一些对 X11 和 rgb.txt 文件的引用,起初看起来这正是我要找的,但它们似乎与索引号不匹配。我发现的文件中有 752 种颜色(大多数是重复的,所以说 376 仍然是 256)。还有 50 种灰色阴影(如果计算重复,则为 100 种),但 Ansi 索引颜色有 23 种,因此看起来不一样。如果这些以某种方式确实包含 ansi 扩展颜色索引中的颜色,是否有人有哪些名称在哪个索引中的列表?

附注。我知道 esc[38;2;r;g:bm 可以使用 rgb 值设置颜色,但我不能让它在我的 Mac 上工作,我对索引颜色的默认值更感兴趣。

一些网站:(由于低代表只能发布2个?但我检查了很多网站)

This one has the rgb for the standard colors but not the extended ones.

This one has a chart of the colors but not the rgb values

最佳答案

256色表及其分区

256 色终端的颜色范围由 4 部分组成,通常是 5 部分,在这种情况下,您实际上会得到 258 种颜色:

  • 颜色编号 0 到 7 是默认的终端颜色,其实际 RGB 值没有标准化,通常可以配置。
  • 颜色编号 8 到 15 是“明亮”的颜色。大多数情况下,这些是索引为 8 的较浅的颜色。它们也不是标准化的,通常可以配置。根据终端和 shell ,它们经常代替粗体字体或与粗体字体结合使用。
  • 颜色编号 16 到 231 是 RGB 颜色。这 216 种颜色由三个 RGB 轴中每个轴上的 6 个值定义。也就是说,每种颜色的范围不是 0 - 255,而是 0 - 5。

    然后像这样计算颜色数:

    number = 16 + 36 * r + 6 * g + b

    r , gb在 0 - 5 范围内。
  • 色号 232 到 255 是灰度级,从深到浅有 24 种灰度。
  • 前景和背景的默认颜色。在许多终端中,它们可以独立于 256 种索引颜色进行配置,从而提供额外的两种可配置颜色。当不设置任何其他颜色或禁用其他颜色(即 print '\e[m' )时,您会得到它们。

  • 一些来源:
  • urxvt联机帮助页:

    In addition to the default foreground and background colours, urxvt can display up to 88/256 colours: 8 ANSI colours plus high-intensity (potentially bold/blink) versions of the same, and 72 (or 240 in 256 colour mode) colours arranged in an 4x4x4 (or 6x6x6) colour RGB cube plus a 8 (24) colour greyscale ramp.

  • xterm联机帮助页:

    These specify the colors for the 256-color extension. The default resource values are for colors 16 through 231 to make a 6x6x6 color cube, and colors 232 through 255 to make a grayscale ramp.

  • Wikipedia article on ANSI escape codes (这本身又缺乏对该主题的引用)


  • 默认 RGB 值

    理论上,为了获得均匀分布的颜色范围,可以这样计算 16 - 231 范围内颜色的 RGB 值:
    # example in Python: // is integer divison, % is modulo
    rgb_R = ((number - 16) // 36) * 51
    rgb_G = (((number - 16) % 36) // 6) * 51
    rgb_B = ((number - 16) % 6) * 51

    但是似乎实际的方法是不同的:

    我测试过的任何终端模拟器似乎都遵循 XTerm 并映射值 [0, 1, 2, 3, 4, 5]红色、绿色和蓝色的值 [0, 95, 135, 175, 215, 255]在 RGB 色轴上。 (我使用 XTerm (297) URxvt (v9.19)、ROXTerm (2.8.1)、gnome-terminal (3.6.2) 和 xfce4-terminal (0.6.3) 进行了测试)

    可以使用以下算法计算给定索引的 RGB 值:
    # example in Python: 'a = b if c else d' is 'a = (c) ? b : d` in C, Perl, etc.
    index_R = ((number - 16) // 36)
    rgb_R = 55 + index_R * 40 if index_R > 0 else 0
    index_G = (((number - 16) % 36) // 6)
    rgb_G = 55 + index_G * 40 if index_G > 0 else 0
    index_B = ((number - 16) % 6)
    rgb_B = 55 + index_B * 40 if index_B > 0 else 0

    灰度似乎遵循这个简单的公式:
    rgb_R = rgb_G = rgb_B = (number - 232) * 10 + 8
    256colres.plXTerm sources (version 313) 的根使用类似的算法生成 256colres.h ,其中包含 256 色模式的颜色定义:

    $line1="COLOR_RES(\"%d\",";
    $line2="\tscreen.Acolors[%d],";
    $line3="\tDFT_COLOR(\"rgb:%2.2x/%2.2x/%2.2x\")),\n";

    # colors 16-231 are a 6x6x6 color cube
    for ($red = 0; $red < 6; $red++) {
    for ($green = 0; $green < 6; $green++) {
    for ($blue = 0; $blue < 6; $blue++) {
    $code = 16 + ($red * 36) + ($green * 6) + $blue;
    printf($line1, $code);
    printf($line2, $code);
    printf($line3,
    ($red ? ($red * 40 + 55) : 0),
    ($green ? ($green * 40 + 55) : 0),
    ($blue ? ($blue * 40 + 55) : 0));
    }
    }
    }

    # colors 232-255 are a grayscale ramp, intentionally leaving out
    # black and white
    $code=232;
    for ($gray = 0; $gray < 24; $gray++) {
    $level = ($gray * 10) + 8;
    $code = 232 + $gray;
    printf($line1, $code);
    printf($line2, $code);
    printf($line3,
    $level, $level, $level);
    }

    在终端中显示可用颜色

    这是在 256 色终端上打印所有颜色的 zsh 函数(如果 TERM 设置为 256 色值):

    function termcolors () 
    {
    print TERM
    print -P "Foreground: >█<"
    print -P "Background: >%S█%s<\n"

    print " 0 1 2 3 4 5 6 7"
    for b (0 1)
    do
    printf "%d %2d " $b $(( 8 * b ))
    for r (0 1 2 3 4 5 6 7)
    do
    c=$(( 8 * b + r ))
    print -nP "%K{$c} %k"
    done
    printf " %2d\n" $(( 8 * b + 7 ))
    done

    print

    print RGB
    for r (0 1 2 3 4 5)
    do
    print "$r $(( 16 + 36 * r )) - $(( 16 + 36 * r + 35 ))\n 0 1 2 3 4 5"
    for g (0 1 2 3 4 5)
    do
    printf "%d %3d " $g $(( 16 + 36 * r + 6 * g ))
    for b (0 1 2 3 4 5)
    do
    c=$(( 16 + 36 * r + 6 * g + b ))
    print -nP "%K{$c} %k"
    done
    printf " %3d\n" $(( 16 + 36 * r + 6 * g + 5))
    done
    print
    done

    print

    print GRAY
    for g in $(seq 0 23)
    do
    c=$(( 232 + g ))
    printf "%2d %3d " $g $c
    print -P "%K{$c} %k"
    done
    }

    在运行时更改 RGB 值

    在某些终端(至少 xtermgnome-terminaltermiteurxvt )中,所有这些颜色都可以在运行时通过发送以下之一来更改 XTerm Control Sequences :
    OSC 4; c ; spec BEL
    OSC 4; c ; spec ST

    在哪里:
  • OSC是转义字符( \e\033 )后跟 ]
  • c是颜色编号 (0 - 255)
  • spec是颜色规范(例如 red#ff0000rgb:ff/00/00rgbi:1/0/0 - 实际工作可能取决于终端)
  • BEL是铃字符( \a\007 )
  • ST是字符串终止符 \e\\\033\\

  • 这些控制序列可以通过简单地用 echo 打印它们来发送。 :
    echo -en "\e]4;COLOR;SPEC\a"
    echo -en "\e]4;COLOR;SPEC\a"

    例如,为了将颜色编号 5(通常是某种洋红色)设置为红色,以下任何一个都应该起作用:
    echo -en "\e]4;5;red\a"
    echo -en "\e]4;5;#ff0000\e\\"
    echo -en "\033]4;5;rgb:ff/00/00\007"

    可以使用控制序列之一将这些颜色重置为其(配置的)默认值
    OSC 104 ; c BEL
    OSC 104 ; c ST

    因此,以下循环会将所有颜色从 0 到 255 重置为其配置或默认值:
    for c in {0..255}; do
    echo -en "\e]104;$c\a"
    done

    对于默认的前景色和背景色,控制序列是 OSC 10 ; spec BELOSC 11 ; spec BEL , 分别。例如:
    echo -en "\e]10;red\a"
    echo -en "\e]11;green\a"

    这些可以用 OSC 110 BEL 重置和 OSC 111 BEL分别:
    echo -en "\e]110\a"
    echo -en "\e]111\a"

    关于bash - Ansi 扩展颜色索引中颜色的 RGB 值 (17-255),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159322/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com