web-dev-qa-db-ja.com

Ansi拡張色インデックス(17-255)の色のRGB値

私の質問は一般的にANSIカラーを使用したシェルスクリプトですが、参考までにApple Mac OS X 10.9 Mavericksを使用しています。デフォルトの端末として「iTerm」端末アプリを使用していますが、ビルド済みの端末でも確認しています。 「ターミナル」アプリでも。デフォルトのシェルとしてZSH(5.0.7)を使用していますが、BASH(3.2.51)もチェックインしています。

Esc [38; 5; xmおよびesc [48; 5; xmで使用できる256色のインデックス付き拡張フォア/バックグラウンドAnsiエスケープコードのRGB値のリストがあるかどうかを調べようとしています。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色があります(ほとんどが重複しているので、さらに256である376と言います)。また、50のグレーの色合い(重複を数える場合は100)がありますが、Ansiのインデックスカラーは23であるため、同じではないようです。これらが何らかの方法でansi拡張カラーインデックスの色を含んでいる場合、誰かがどの名前がどのインデックスにあるかのリストを持っていますか?

PS。 esc [38; 2; r; g:bmはおそらくrgb値を使用して色を設定できることは知っていますが、Macで機能させることができず、インデックスカラーのデフォルト値にもっと興味があります。

いくつかのサイト:(低い担当者のために2つしか投稿できませんか?しかし、私は多くのサイトをチェックしました)

これには標準色のRGBがありますが、拡張色にはありません。

これには色のチャートがありますが、RGB値はありません

17
Jim Knecht

256色のテーブルとそのパーティション

256色の端末の色の範囲は4つの部分で構成され、多くの場合5つです。この場合、実際には258色になります。

  1. 色番号0〜7はデフォルトの端末色であり、実際のRGB値は標準化されておらず、多くの場合構成できます。

  2. 色番号8から15は「明るい」色です。ほとんどの場合、これらはインデックス-8の明るい色合いです。また、標準化されておらず、構成できることもよくあります。ターミナルとシェルによっては、太字のフォントフェースの代わりに、またはそれらと組み合わせて使用​​されることがよくあります。

  3. 色番号16〜231はRGBカラーです。これらの216色は、3つのRGB軸のそれぞれの6つの値によって定義されます。つまり、値0〜255の代わりに、各色の範囲は0〜5のみです。

    次に、色番号は次のように計算されます。

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

    rg、およびbの範囲は0〜5です。

  4. 色番号232から255はグレースケールで、暗い色から明るい色まで24色のグレーがあります。

  5. 前景と背景のデフォルトの色。多くの端末では、256のインデックスカラーとは独立して構成でき、さらに2つの構成可能な色を提供します。他の色を設定していないとき、または他の色を無効にしているときに取得します(つまり、print '\e[m')。

いくつかの情報源:

  • urxvtマンページ:

    デフォルトの前景色と背景色に加えて、urxvtは最大88/256色を表示できます:8つのANSI色と同じ高輝度(太字/点滅の可能性がある)バージョン、および72(または256色モードでは240)色が配置されています4x4x4(または6x6x6)カラーRGBキューブと8(24)カラーグレースケールランプ。

  • xtermマンページ:

    これらは、256色の拡張機能の色を指定します。デフォルトのリソース値は、6x6x6カラーキューブを作成するための16〜231色、およびグレースケールランプを作成するための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]をRGB色軸の値[0, 95, 135, 175, 215, 255]にマップしているようです。 (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

XTermソース(バージョン313) のルートにある256colres.plは、同様のアルゴリズムを使用して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-terminaltermite、およびurxvt)では、次のいずれかを送信することにより、実行時にこれらすべての色を変更できます XTerm制御シーケンス

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"

これらの色は、制御シーケンスの1つを使用して、(構成された)デフォルトにリセットできます。

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 BELOSC 111 BELでリセットできます。

echo -en "\e]110\a"
echo -en "\e]111\a"
37
Adaephon

これが私のカラーユーティリティです。最も便利なのは、おそらくHex-> True、またはRGB-> 256コンバーターです。この多くは、y'alls help <3のおかげでまとめました

rgbtohex () {
  # usage) `rgbtohex 17 0 26` ==> 1001A
  # usage) `rgbtohex -h 17 0 26` ==> #1001A
  addleadingzero () { awk '{if(length($0)<2){printf "0";} print $0;}';}
  if [[ ${1} == "-h" ]]; then
    r=${2}; g=${3}; b=${4};h='#';
  else
    r=${1}; g=${2}; b=${3};h='';
  fi
  r=`echo "obase=16; ${r}" | bc | addleadingzero`
  g=`echo "obase=16; ${g}" | bc | addleadingzero`
  b=`echo "obase=16; ${b}" | bc | addleadingzero`
  echo "${h}${r}${g}${b}"
}

rgbto256 () {
  # usage: `rgbto256 0 95, 135` ==> 22
  echo "define trunc(x){auto os;os=scale;scale=0;x/=1;scale=os;return x;};" \
    "16 + 36 * trunc(${1}/51) + 6 * trunc(${2}/51) +" \
    " trunc(${3}/51)" | bc
  # XTerm Color Number = 16 + 36 * R + 6 * G + B | 0 <= R,G,B <= 5
}

hextorgb () {
  # usage) `hexttorgb "11001A" ==> 17 0 26
  # usage) `hexttorgb "#11001A" ==> 17 0 26
  hexinput=`echo ${1} | tr '[:lower:]' '[:upper:]'`  # uppercase-ing
  hexinput=`echo ${hexinput} | tr -d '#'`          # remove Hash if needed
  a=`echo ${hexinput} | cut -c-2`
  b=`echo ${hexinput} | cut -c3-4`
  c=`echo ${hexinput} | cut -c5-6`
  r=`echo "ibase=16; ${a}" | bc`
  g=`echo "ibase=16; ${b}" | bc`
  b=`echo "ibase=16; ${c}" | bc`
  echo ${r} ${g} ${b}
}

trueHexPrint () {
  # Generates Truecolor Escape Sequences from Hex Strings. (remove '\\' to use)
  # -fg     Prints as a foreground color. (default)
  # -bg     Prints as a background color.
  # usage) `trueHexPrint -fg "11001A" ==> '\e[38;2;17;0;26m'
  # usage) `trueHexPrint -bg "11001A" ==> '\e[48;2;17;0;26m'
  if [[ ${1} =~ "-fg" || ${1} =~ "-f" ]]; then
    fgbg=38; hexinput=${2};
  Elif [[ ${1} =~ "-bg" || ${1} =~ "-b" ]]; then
    fgbg=48; hexinput=${2};
  else
    fgbg=38; hexinput=${1}
  fi
  hexinput=`echo ${hexinput} | tr '[:lower:]' '[:upper:]'`  # uppercase-ing
  hexinput=`echo ${hexinput} | tr -d '#'`               # remove Hash if needed
  a=`echo ${hexinput} | cut -c-2`
  b=`echo ${hexinput} | cut -c3-4`
  c=`echo ${hexinput} | cut -c5-6`
  r=`echo "ibase=16; ${a}" | bc`
  g=`echo "ibase=16; ${b}" | bc`
  b=`echo "ibase=16; ${c}" | bc`
  printf "\\\\e[${fgbg};2;${r};${g};${b}m" # Remove one set of '\\' to utilize
}

XColorTable () {
  i=16
  for ((r = 0; r <= 255; r+=40)); do # Do Tricolor
    for ((g = 0; g <= 255; g+=40)); do
      for ((b = 0; b <= 255; b+=40)); do
    echo "Color$((i++)) = (${r}, ${g}, ${b})"
        if ((b == 0)); then b=55; fi
      done
      if ((b == 0)); then g=55; fi
    done
    if ((r == 0)); then r=55; fi
  done
  for ((m = 8; m <= 238; m+=10)); do # Do Monochrome
    echo "Color$((i++)) = (${m}, ${m}, ${m})"
  done
}

#vim: ft=sh
0