Цвет, палитры, градиенты и изображения во всех цветовых пространствах: от экранов до полиграфии, от выбора цвета до исследований, 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: степенная функция 2.2 эталонного дисплея, а не кусочная кривая кодирования
sRGB 2.2 display → Linear-light sRGB → sRGB
1999, IEC (TC 100)
0.4123907993 0.3575843394 0.1804807884 0.2126390059 0.7151686788 0.0721923154 0.0193308187 0.1191947798 0.9505321522
То, что показывает для значений sRGB монитор, откалиброванный на чистую степенную функцию 2.2.
То, что дисплей, откалиброванный на степенную функцию 2.2, показывает для значений в кодировке sRGB.
Кривая дисплея sRGB – предмет спора: IEC 61966-2-1 называет эталонный дисплей с гаммой 2.2, а ICC считает 2.2 приближением, точной же – кусочную кривую; в тенях они расходятся (0.63% против 1.00% белого при сигнале 0.1).
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import rgbDisplay from 'color-space/rgb-display.js' rgbDisplay.lrgb(0.5, 0.5, 0.5) // → [0.2159, 0.2159, 0.2159] // any-to-any, both ways — the wired hub: import space from 'color-space' space['rgb-display'].rgb(0.5, 0.5, 0.5) // → [128, 128, 128] space.rgb['rgb-display'](128, 128, 128) // → [0.5, 0.5, 0.5] // route: rgb-display → lrgb → rgb