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

フルツールを開く