ライブラリ全体:221の色空間、gzipで71 kB。どの色空間からどの色空間へも、双方向に。
npm install color-space
import space from 'color-space' space.rgb.oklch(255, 128, 0) // → [0.732, 0.186, 53] space.oklch.rgb(0.65, 0.1, 180) // → [56.14, 162.97, 145.41] space.oklch.range // [[0,1], [0,0.4], [0,360]]
あるいは色空間ひとつだけ。バンドルにはほかに何も入りません。
import oklch from 'color-space/oklch.js' oklch.rgb(0.65, 0.1, 180) // → [56.14, 162.97, 145.41]
型付き:TypeScript の型宣言がパッケージに同梱されています。ライブラリ全体にも、各色空間を単体で読み込む場合にも。
画像全体や長いバッファに:54の色空間、gzipで53 kB。計測した26の変換でJSのバッチより1.4〜4.8倍高速。
import space, { alloc } from 'color-space/wasm'
space.oklch.rgb(0.72, 0.16, 41) // → [246, 125, 79]
const buf = alloc(n) // n×3 Float64Array
space.rgb.oklch(buf) // in place
モジュールは何もインポートしないので、WebAssemblyが動く場所ならどこでも動きます:ブラウザ、Node、Deno、Bun。wasmtimeやwasmerを通じてPython、Rust、Goからも。
import struct
from wasmtime import Store, Module, Instance # pip install wasmtime
store = Store() # color-space.wasm: the npm package's dist/
cs = Instance(store, Module.from_file(store.engine, 'color-space.wasm'), []).exports(store)
at = cs['alloc'](store, 1.0) & 0xFFFFFFFF # the buffer: n×3 float64 in the kernel's memory
cs['memory'].write(store, struct.pack('3d', 255, 128, 0), at)
cs['rgb_lrgb_n'](store, 1.0) # in place, edge by edge: rgb → linear rgb → oklab
cs['lrgb_oklab_n'](store, 1.0)
struct.unpack('3d', cs['memory'].read(store, at, at + 24)) # (0.732, 0.112, 0.148)
色空間 rgb, lrgb, xyz, xyz-d50, xyy, lms, p3, p3-linear, rec2020, rec2020-linear, a98rgb, a98rgb-linear, prophoto, prophoto-linear, rec709, hsl, hsv, hwb, oklab, oklrab, oklch, oklrch, lab, lchab, lab-d65, lch-d65, din99o-lab, din99o-lch, luv, lchuv, hsluv, hpluv, cam16, hct, ycbcr-bt709, ycbcr-bt2020, jzazbz, jzczhz, ictcp, ictcp-hlg, ipt, din99d, acescg, acescct, acescc, awg3, logc3, logc4, slog3, vlog, log3g10, clog2, ryb, munsell
221の色空間すべてをシェーダー関数として提供。rgbへの変換はJavaScriptと同じく0〜255を返します。フラグメントの色には255で割ってください。
WebGLとOpenGL:GLSL。
import { glsl } from 'color-space/gl'
import oklch from 'color-space/gl/oklch'
const frag = `#version 300 es
precision highp float;
${glsl(oklch, 'rgb')}
out vec4 color;
void main() { color = vec4(oklch_rgb(vec3(0.7, 0.15, gl_FragCoord.x)) / 255.0, 1.0); }`
WebGPU:WGSL。
import { wgsl } from 'color-space/gl'
const code = wgsl(oklch, 'rgb') + `
@fragment fn main(@builtin(position) p: vec4f) -> @location(0) vec4f {
return vec4f(oklch_rgb(vec3f(0.7, 0.15, p.x)) / 255.0, 1.0);
}`
DirectX・Unity・Unreal:HLSL。Metal:MSL。どちらもnaga(任意の依存関係)がWGSLから書き出します。
import { hlsl } from 'color-space/gl/hlsl' // npm i naga-wasm
import { msl } from 'color-space/gl/msl'
await hlsl('oklch', 'rgb') // float3 oklch_rgb(float3)
await msl('oklch', 'rgb') // metal::float3 oklch_rgb(metal::float3)編集ソフトで映像を変換:色空間を2つ選んで、Resolve、Premiere、Final Cut、OBS、ffmpeg用の.cubeをダウンロード。カメラログの変換はAcademy公式のACES変換と一致します。
Photoshop、OSのカラーマネジメント、lcms、ImageMagickで使うには、色空間を.iccプロファイルとしてダウンロードします。RGB色空間はPhotoshopの作業用スペースとして使え、そのほかはルックアップテーブルで変換します。
AIエージェント向け。変換を推測せず、検証済みの変換を呼び出します。
npx -y color-space mcp
// Claude Code
claude mcp add color-space -- npx -y color-space mcp
// VS Code
code --add-mcp '{"name":"color-space","command":"npx","args":["-y","color-space","mcp"]}'
// Claude Desktop · Cursor · .mcp.json
{ "mcpServers": { "color-space": { "command": "npx", "args": ["-y", "color-space", "mcp"] } } }選択範囲の塗りと線を、221のどの色空間でも表示します。チャンネルごとに平面とバーを、ファイルの色域でクリップして描き、色はCSSとしてコピーできます。
ファイル内のすべての色(CSS、Swift、Flutter、Compose、Unity、デザイントークン)を、221のどの色空間でも表示します。チャンネルごとに平面とバーを描き、編集はその色の元の表記で書き戻します。
色を表す座標系で、軸と範囲、そして数値を測定可能な光と結びつける規則からなります。人間の視覚は3種類の錐体細胞(S、M、L)による3色型なので、目に見えるあらゆる色を表すには少なくとも3つの座標が必要です。同じオレンジ色がrgb(255 128 0)、oklch(0.732 0.186 53)、XYZ [49, 36.7, 4.5]と表されます。パレットは選んだ少数の色、色空間はあらゆる色を書き表すための方法です。
カラーモデルは、色を表す成分を定めます。RGBは3つの原色、HSLは色相・彩度・明度、CMYKは4色のインクです。色空間はさらに原色、白色点、符号化のカーブを定め、数値の組が測定可能な1つの色に対応するようにします。そのため、rgb(255 0 0)はsRGB、Display P3、Adobe RGBで異なる赤を表します。同じモデルでも、色空間は異なります。
一般にはどちらも色空間と呼ばれ、CSSのcolor-mix(in hsl, …)やこのカタログでも同じ呼び方をしています。独自の基準をもたないモデルは、既存の色空間を基に定義できます。ここでのHSLとHSVは、CSSと同じくsRGBを基にしています。
用途によります。
すべての色空間を目的別に見るには、カタログを用途でグループ化してください。
OKLCHです。色相・クロマ・明度という3つのパラメーターはそのままで、明度が実際の明るさに対応します。HSLではL=50の黄色はL=50の青の約13倍の光を発するので、Lが等しくても明るさは等しくありません。OKLCHでは等しくなります。CSSはoklch()をネイティブにサポートしています。
上部の色フィールドに、たとえば#ff8000と入力するか貼り付けます。ページ上のすべての色空間がその色を一度に表示します。OKLCHでは0.732、0.186、53で、CSSではoklch(0.732 0.186 53)と書きます。各詳細ページのcssタブでコピーできる形が得られ、コードではspace.rgb.oklch(255, 128, 0)です。
ガンマ符号化されたsRGBで計算されるからです。この空間で2色の数値を平均すると、実際に光を混ぜた場合より暗く濁った光になります。OKLabで補間すればこれを避けられます。CSSではlinear-gradient(in oklab, red, blue)と書きます。各詳細ページのinterpolate行は、同じブレンドを2つの色空間で並べて描くので、選ぶ前に違いを確かめられます。
ある色空間では表せても、別の色空間やお使いの画面では表示できない色のことです。鮮やかなDisplay P3の緑はsRGBには存在せず、変換すると数値が有効範囲の外に出ます。アトラスではこれが見えるようにしています。現在の色の横の⚠は、選んだ「上限」の外にあることを示します。Altキーを押したまま平面やバーにポインタを置くと、そこの色にどの広い色域(P3、Rec. 2020)が必要かが表示されます。範囲外の区間は市松模様の上に薄く表示されます。
画面は光を発し、紙はインクが吸収しなかった光を反射します。紙の上のインクで出せる鮮やかな色は少なく、彩度の高いRGBの青・緑・赤はその外に出るため、くすんで印刷されます。製版では、印刷機と用紙に合わせて作られたICCプロファイル(欧州のコート紙ならFOGRA39、米国ならGRACoLなど)を通して変換します。このカタログのCMYKは、CSSがプロファイルなしのdevice-cmyk()に使う単純な式です。数値としては正しくても、印刷の校正にはなりません。
Webや共有にはsRGBを使います。ファイルにプロファイルがなければ、ブラウザやスマートフォンはsRGBとみなすからです。Display P3は、プロファイルを埋め込んだままにしておけば、Appleや多くのAndroidの画面で鮮やかな色をより多く再現できます。プリントラボから求められたらAdobe RGBで渡します。ProPhoto RGBは16ビットでの編集用です。色域が非常に広いため、8ビットのファイルではバンディングが起きます。
変換はルックアップによる近似ではなく閉じた式で、往復変換しても浮動小数点の誤差の範囲で元に戻ります。わずかな例外は該当箇所に記載しています。OSA-UCSには閉じた逆変換がなく、Munsellのような色票系は公表された等級のあいだを補間します。rgbの出力はクランプしません。sRGB外の色は0未満や255超の値で返るので、クランプは表示するときだけにしてください。
検証もしています。どの色空間も実装元の論文や規格にリンクし、値は重なる範囲でcolorjs.ioと、カメラのログはAcademy公式のACES変換と照合しています。何を何と照合したかは、公表された論文そのものに誤りがあった箇所も含めてformula-verification.mdに記録しています。
数値が他のライブラリと合わないときは、値の範囲を比べてください。多くのライブラリはすべてを0〜1に揃えますが、このライブラリは各色空間の慣例的な範囲(RGBは0〜255、Labの明度は0〜100、色相は0〜360)を保ちます。範囲はどのカードにも表示され、コードではspace.oklch.rangeです。
ネイティブに書けるのはrgb()、hsl()、hwb()、lab()、lch()、oklab()、oklch()、そしてDisplay P3、Adobe RGB、ProPhoto、リニアsRGB、XYZ(D65とD50)を表すcolor()です。CSSのrec2020は純粋な2.4ガンマで、このカタログのRec. 2020が使うBT.2020のカーブではありません。同じ数値でも別の色を指します。各詳細ページのcssタブは現在の色をコピーできる形で書き出します。CSSにない色空間は、代わりにICCプロファイルかLUTとして提供されます。
表示を開き、色覚で1型色覚(赤)、2型色覚(緑)、3型色覚(青)のいずれかを選びます。選んだ色覚での見え方でカタログが再描画されるので、パレットの色どうしが見分けられるかを確かめられます。NEIの集計では、男性の約12人に1人が色覚異常です。
これらはライセンス製品です。色は公表された式ではなく、所有者が販売するデータで定義されています。実装できる公開の数式がなく、その表を再配布することも法的に認められません。数式が公開されている近縁の体系は収録しています。Munsell(1943年の修正マンセル値は公開されています)とRAL Design(CIELABで直接定義)です。数式が一度でも公表された体系なら、ここに収録します。足りないものを提案してください。
| ツール | 色空間 | カメラのログ | ルマ・クロマ | sRGB | ツールキット | サイズ | 速度 | ターゲット |
|---|---|---|---|---|---|---|---|---|
| 205 | 31 | 16 | 0–255 | parse mix ΔE contrast CVD | 62 kB | JS, WASM, GL, LUT, ICC, OCIO, MCP, Figma, VS Code, CLI, web | ||
| 30 | – | 1 | 0–1 | parse mix gamut ΔE contrast CVD | 23 kB | JS | ||
| 51 | – | – | 0–1 | parse mix gamut ΔE contrast | 34 kB | JS, web | ||
| chroma-js | 11 | – | – | 0–255 | parse mix ΔE contrast palettes | 17 kB | JS | |
| @texel/color | 16 | – | – | 0–1 | parse gamut ΔE | 9 kB | JS | |
| 128 | 24 | 6 | 0–1 | ΔE CVD | – | – | Python, LUT | |
| 77 | – | – | 0–1 | parse mix gamut ΔE contrast CVD palettes | – | – | Python | |
| 9 | – | – | 0–1 | mix contrast CVD palettes | – | – | R, web | |
| 57 | 11 | – | 0–1 | gamut | – | – | C++, Python, GL, LUT, ICC | |
| 22 | – | – | 0–1, 0–255 | ΔE | – | – | web | |
| 9 | – | – | 0–255 | parse gamut | – | – | web |
各プロジェクトのソース、パッケージ、ページに基づく(2026-10-18時点)。
@software{Ivanov_color-space_2026,
author = {Ivanov, Dmitry},
license = {CC0-1.0},
month = oct,
title = {{color-space}},
url = {https://github.com/colorjs/color-space},
version = {3.4.0},
year = {2026}
}Ivanov, D. (2026). color-space (Version 3.4.0) [Computer software]. https://github.com/colorjs/color-space
知覚的
HK=Helmholtz–Kohlrausch。Hellwig 2022の明度に加える効果
Hellwig 2022 HK → Hellwig 2022 → CIE XYZ → sRGB
2022, Luke Hellwig, Dale Stolitzka & Mark Fairchild
彩度の高い色に、見た目どおりの明度を与える——Helmholtz–Kohlrausch効果。
彩度の高い色で増す明度を予測する、色の見えのモデル化。
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import hellwig2022Hk from 'color-space/hellwig2022-hk.js' hellwig2022Hk.hellwig2022(43.7, 0, 215) // → [43.5112, 0.0401, 215.1887] // any-to-any, both ways — the wired hub: import space from 'color-space' space['hellwig2022-hk'].rgb(43.7, 0, 215) // → [128, 128, 128] space.rgb['hellwig2022-hk'](128, 128, 128) // → [43.7, 0, 215] // route: hellwig2022-hk → hellwig2022 → xyz → rgb