ANSI 6x6x6カラーキューブ - カラーコードの計算方法

公式code = 16 + 36*r + 6*g + bによるANSI 216色キューブの仕組みを学ぶ。RGB値とANSI 256色コード間のプログラムによる変換方法。

256 Colors

詳細な説明

6x6x6カラーキューブ

256色パレットの色16-231は6x6x6カラーキューブを形成します。その数学を理解することで、RGB値とANSIカラーコード間をプログラム的に変換できます。

公式

code = 16 + (36 * r) + (6 * g) + b

r、g、bは0から5のインデックスで、以下のRGB値を表します:

インデックス RGB値
0 0
1 95
2 135
3 175
4 215
5 255

逆計算

カラーコードからRGB値を見つけるには:

# Python: ANSIコードをRGBに変換
def ansi_to_rgb(code):
    code -= 16
    b = code % 6
    g = (code // 6) % 6
    r = code // 36
    values = [0, 95, 135, 175, 215, 255]
    return (values[r], values[g], values[b])

最も近い256色の検索

任意のRGB値がある場合、最も近いマッチを見つけます:

def rgb_to_ansi256(r, g, b):
    values = [0, 95, 135, 175, 215, 255]
    ri = min(range(6), key=lambda i: abs(values[i] - r))
    gi = min(range(6), key=lambda i: abs(values[i] - g))
    bi = min(range(6), key=lambda i: abs(values[i] - b))
    return 16 + (36 * ri) + (6 * gi) + bi

キューブ内の一般的な色

色 コード RGB
純粋な赤 196 (255, 0, 0)
純粋な緑 46 (0, 255, 0)
純粋な青 21 (0, 0, 255)
黄 226 (255, 255, 0)
シアン 51 (0, 255, 255)
マゼンタ 201 (255, 0, 255)
オレンジ 208 (255, 175, 0)
ピンク 213 (255, 135, 255)

実用的な例

# 赤軸に沿ったカラーグラデーションを表示
for r in 0 1 2 3 4 5; do
  code=$((16 + 36 * r))
  echo -en "\033[48;5;${code}m  \033[0m"
done
echo

ユースケース

カラーキューブの数学を理解することは、ターミナルカラーライブラリ、構文ハイライトエンジン、またはWebカラー(hex/RGB)を最も近いANSI 256色に変換する必要があるツールを構築する開発者にとって重要です。chalk、colorama、termcolorなどのライブラリは、便利なカラーAPIを提供するためにこのアルゴリズムを内部的に使用しています。

試してみる — ANSI Color Code Reference

フルツールを開く →