Цвет, палитры, градиенты и изображения во всех цветовых пространствах: от экранов до полиграфии, от выбора цвета до исследований, 1860–2026.
Вся библиотека: 221 пространство, 71 КБ в gzip – из любого пространства в любое другое и обратно.
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 пространства, 53 КБ в gzip, в 1.4–4.8 раза быстрее пакетной обработки на JS на 26 измеренных преобразованиях.
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 – а также из Python, Rust или Go через wasmtime или wasmer.
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 возвращает 0–255, как в JavaScript: для цвета фрагмента разделите на 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. Оба варианта генерирует из WGSL naga – необязательная зависимость.
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)Преобразуйте видео в своём редакторе: выберите два пространства и скачайте .cube для Resolve, Premiere, Final Cut, OBS или ffmpeg. Преобразования лог-профилей камер совпадают с официальными преобразованиями ACES от Академии.
Используйте пространство в Photoshop, системном управлении цветом, lcms или ImageMagick: скачайте его как профиль .icc. Пространства RGB работают как рабочие пространства Photoshop, остальные преобразуются через таблицу LUT.
Для ИИ-агентов: они вызывают проверенные преобразования, а не угадывают их.
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 пространства, с плоскостью и полосой на каждый канал; правка записывается в той же нотации, в которой задан цвет.
Система координат для цвета: оси, диапазоны и правило, связывающее числа с измеримым светом. Зрение человека трихроматично: колбочки бывают трёх типов (S, M, L), поэтому для описания любого видимого цвета нужно не меньше трёх координат. Один и тот же оранжевый – это rgb(255 128 0), oklch(0.732 0.186 53) и XYZ [49, 36.7, 4.5]. Палитра – это набор выбранных цветов; пространство – способ записать вообще любой цвет.
Цветовая модель определяет, какими компонентами описывается цвет: тремя основными цветами в RGB, цветовым тоном, насыщенностью и светлотой в HSL, четырьмя красками в CMYK. Цветовое пространство уточняет основные цвета, точку белого и передаточную кривую, чтобы каждому набору значений соответствовал измеримый цвет. Поэтому rgb(255 0 0) обозначает разный красный в sRGB, Display P3 и Adobe RGB: одна модель, три пространства.
В обиходе оба понятия называют пространствами, в том числе в CSS с color-mix(in hsl, …) и в этом каталоге. Модель можно связать с уже определённым цветовым пространством: здесь HSL и HSV основаны на sRGB, как в CSS.
Зависит от задачи:
Чтобы разложить все пространства по задачам, выберите группировку каталога Применение.
OKLCH. Те же три параметра – цветовой тон, хрома, светлота, – но светлоте можно доверять: в модели HSL жёлтый при L=50 излучает примерно в 13 раз больше света, чем синий при L=50, так что равные 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 с гамма-кодированием получается более тёмный и тусклый цвет, чем при смешении соответствующих световых потоков. Интерполяция в OKLab позволяет избежать этого потемнения; в CSS это linear-gradient(in oklab, red, blue). Строка интерполяция в каждой карточке показывает один переход в двух пространствах рядом: можно сравнить результат и выбрать подходящее пространство.
Откройте логарифмическое пространство своей камеры, например S-Log3, LogC4 или Apple Log. В его блоке LUT выберите Rec. 709 и свой редактор: DaVinci Resolve, Premiere Pro, Final Cut Pro, OBS, ffmpeg и другие. Файл .cube создаст ваш браузер. Это техническое преобразование без тонального отображения: света выше диффузного белого обрезаются, а художественную цветокоррекцию вы делаете сами.
Это цвет, который одно пространство может описать, а другое – или ваш экран – не может показать. Яркого зелёного цвета Display P3 в sRGB нет: при преобразовании его координаты выходят за допустимый диапазон. Атлас этого не скрывает: значок ⚠ у текущего цвета означает, что цвет выходит за выбранный «Предел»; если навести указатель на плоскость или полосу с нажатой клавишей Alt, подсказка покажет, какой более широкий охват нужен цвету в этом месте (P3, Rec. 2020); участки вне диапазона полупрозрачно проступают поверх шахматного фона.
Экран излучает свет, а бумага отражает то, что не поглотили краски. Охват печати меньше: насыщенные синие, зелёные и красные цвета RGB в него не попадают, поэтому на оттиске они тусклее. При допечатной подготовке цвета преобразуют через ICC-профиль, составленный для печатной машины и бумаги, например FOGRA39 для европейской мелованной бумаги или GRACoL в США. CMYK в этом каталоге – простая формула, по которой CSS вычисляет device-cmyk() без профиля: числа она даёт верные, но цветопробой печати не является.
Для веб-сайтов и обмена файлами подходит sRGB: браузеры и телефоны подразумевают его, если в файле нет профиля. Display P3 передаёт больше цветов яркой сцены на экранах Apple и многих Android, если профиль встроен в файл. Отправляйте Adobe RGB, когда его просит фотолаборатория. ProPhoto RGB оставьте для 16-битной обработки: его охват так широк, что в 8-битных файлах появляются полосы на градиентах.
Преобразования вычисляются по аналитическим формулам, а не по табличным приближениям; при прямом и обратном пересчёте значения совпадают с точностью до погрешности вычислений с плавающей запятой. Исключений немного, и они отмечены в описаниях: у OSA-UCS нет аналитического обратного преобразования, а в системах-атласах вроде Munsell значения интерполируются между опубликованными образцами. Значения в rgb никогда не ограничиваются: цвет за пределами sRGB возвращается со значениями ниже 0 или выше 255, поэтому ограничивайте их только при выводе на экран.
Для каждого пространства указана статья или спецификация, по которой реализовано преобразование. Результаты сверяются с colorjs.io для пространств, поддерживаемых обеими библиотеками, а логарифмические кривые камер – с официальными преобразованиями ACES от Киноакадемии. В formula-verification.md перечислены проверки и их источники, в том числе обнаруженные ошибки в опубликованных статьях.
Если числа расходятся с результатами другой библиотеки, сравните диапазоны: здесь у каждого пространства сохранены привычные диапазоны – RGB 0–255, светлота Lab 0–100, цветовой тон 0–360, – тогда как многие библиотеки сводят всё к 0–1. Диапазоны указаны в каждой карточке; в коде это space.oklch.range.
CSS поддерживает rgb(), hsl(), hwb(), lab(), lch(), oklab(), oklch(), а также color() для Display P3, Adobe RGB, ProPhoto, линейного sRGB и XYZ (D65 и D50). В CSS rec2020 использует степенную функцию с гаммой 2.4, а не кривую BT.2020 пространства Rec. 2020 из этого каталога. Поэтому одинаковые числа обозначают разные цвета. На вкладке css каждой карточки можно скопировать запись текущего цвета. Преобразования для пространств, которых нет в CSS, можно экспортировать как ICC-профили или таблицы LUT.
Откройте Вид и в разделе Зрение выберите режим: слепота к красному (протанопия), слепота к зелёному (дейтеранопия) или слепота к синему (тританопия). Каталог перерисуется так, как его видит такой глаз, и можно проверить, остаются ли цвета палитры различимыми. Нарушение цветового зрения есть примерно у 1 из 12 мужчин, по данным NEI.
Это лицензируемые продукты: их цвета задаются данными, которые продают владельцы, а не опубликованными формулами, – так что открытых формул для реализации нет, а распространять их таблицы было бы незаконно. В каталог входят сходные системы с опубликованными математическими определениями: 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
Дисплеи и веб
display: декодирование эталонного дисплея – то, что CSS записывает как color(rec2020 …)
Rec. 2020 display → Linear-light Rec. 2020 → CIE XYZ → sRGB
2011, ITU-R; W3C CSS WG
0.6369580483 0.1446169036 0.1688809752 0.262700212 0.6779980715 0.0593017165 0 0.028072693 1.0609850577
Color(rec2020 …) из CSS: основные цвета BT.2020 со степенной функцией 2.4 по BT.1886.
Color(rec2020 …) в CSS; привязанное к дисплею видео UHD на мониторе BT.1886.
Под именем rec2020 ходят две кривые: если декодировать обратной камерной кривой BT.2020 (так делал colorjs.io 0.5), сигнал 0.5 даёт на 37% больше света.
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import rec2020Display from 'color-space/rec2020-display.js' rec2020Display['rec2020-linear'](0.53, 0.53, 0.53) // → [0.2159, 0.2159, 0.2159] // any-to-any, both ways — the wired hub: import space from 'color-space' space['rec2020-display'].rgb(0.53, 0.53, 0.53) // → [128, 128, 128] space.rgb['rec2020-display'](128, 128, 128) // → [0.53, 0.53, 0.53] // route: rec2020-display → rec2020-linear → xyz → rgb