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

 极御云安全 发布于 2022-12-09 14:51

我的问题是使用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扩展颜色索引中的颜色,那么任何人都有一个列表,其中哪些名称在哪个索引中?

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

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

这个有标准颜色的rgb而不是扩展的颜色.

这个有一个颜色图表,但没有rgb值

1 个回答
  • 256色表及其分区

    256色终端的颜色范围由4个部分组成,通常为5个,在这种情况下,您实际上可以获得258种颜色:

      颜色编号0到7是默认的终端颜色,其实际RGB值未标准化并且通常可以配置.

      颜色编号8到15是"明亮"颜色.大多数情况下,它们的颜色较浅,指数为8.它们也没有标准化,通常可以进行配置.根据终端和shell,它们通常用于代替粗体字体或与粗体字体结合使用.

      颜色编号16至231是RGB颜色.这三种RGB颜色由三个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 手册页:

    除了默认的前景色和背景色之外,urxvt还可以显示多达88/256种颜色:8种ANSI颜色加上相同的高强度(可能是粗体/闪烁)版本,以及72种(或256种颜色模式中的240种颜色)颜色排列在4x4x4(或6x6x6)彩色RGB立方体加上8(24)彩色灰度渐变.

    xterm 手册页:

    这些指定256色扩展的颜色.默认资源值用于颜色16到231以制作6x6x6颜色立方体,而颜色232到255用于制作灰度渐变.

    关于ANSI转义码的维基百科文章(反过来本身缺乏对该主题的引用)


    默认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.pl在XTerm源(版本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);
    }
    

    显示终端中的可用颜色

    这是一个zsh函数,可以在256色终端上打印所有颜色(如果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值

    在一些端子(至少xterm,gnome-terminal,termiteurxvt)所有这些颜色可以在运行时通过发送下列之一被改变的XTerm控制序列:

    OSC 4; c ; spec BEL
    OSC 4; c ; spec ST
    

    哪里:

    OSC是后跟的转义字符(\e\033)]

    c 是颜色编号(0 - 255)

    spec是颜色规格(例如red,#ff0000,rgb:ff/00/00,rgbi: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"
    

    2022-12-11 02:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有