
От веба до печати, от выбора цвета до исследований, 1860–2026. Поддержка CSS, шейдеров, WASM и таблиц преобразования цветов (LUT).
Один пакет на JavaScript. Те же преобразования обрабатывают целые изображения в WASM, выполняются в шейдерах GLSL и WGSL и экспортируются как таблицы LUT и ICC-профили.
import space from 'color-space' space.rgb.oklch(255, 128, 0) // → [0.732, 0.186, 53] space.oklch.rgb(0.65, 0.25, 180) // any of 205 × 204 pairs space.oklch.name // 'oklch' space.oklch.range // [[0,1], [0,0.4], [0,360]] // one space only – tree-shaken, 0.4-1.5 kB import oklch from 'color-space/oklch.js' oklch.rgb(0.65, 0.25, 180)
// values in the notations CSS already speaks – straight from the library color: oklch(0.732 0.186 53); // space.rgb.oklch(255, 128, 0) color: color(display-p3 0.936 0.529 0.199); // space.rgb.p3(255, 128, 0) color: color(xyz-d65 0.49 0.367 0.045); // space.rgb.xyz(…) / 100 – exact interchange // spaces CSS lacks ship as ICC profiles or LUTs – see those tabs; // every dossier's css tab writes the current color in copyable forms
// per-space metadata – sourced, ships as data.json
import data from 'color-space/data.json' with { type: 'json' }
const m = data.spaces.oklch
m.channels // [{symbol, min, max, name}, …]
m.refs // defining spec / paper links
m.year, m.by // 2020, 'Björn Ottosson'
// scalar or whole-buffer, zero-copy – a true WASM kernel
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 – 27 spaces
// every pair as a GLSL shader chunk
import { glsl } from 'color-space/gl'
import oklch from 'color-space/gl/oklch'
const src = glsl(oklch, 'rgb')
// → self-contained: vec3 oklch_rgb(vec3 c)
// paste into any fragment shader, no uniforms
Преобразование между двумя пространствами можно сохранить как таблицу LUT .cube для Resolve, Premiere, Final Cut, OBS или ffmpeg. Логарифмические кривые камер проверены по официальным преобразованиям ACES от производителей.
Любое пространство можно экспортировать как профиль .icc v2. Для рабочих пространств RGB используются матрица и тональная кривая (Photoshop, управление цветом в ОС), для остальных – таблица CLUT (lcms, ArgyllCMS, ImageMagick).
// an MCP server – convert · gamut · css · space · spaces · cube –
// so an agent calls verified conversions instead of guessing them
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"] } } }
// плагин для Figma: заливки и обводки выделения в любом из 205 пространств – // плоскость и полоса на каждый канал, обрезанные по охвату файла; цвет можно скопировать как CSS figma.com/community/plugin/1691970922817908383/color-space git clone https://github.com/colorjs/color-space // Figma для компьютера: правый клик › Plugins › Development › Import plugin from manifest… color-space/plugins/figma/manifest.json // что он читает, записывает и хранит – plugins/figma
Система координат для цвета: оси, диапазоны и правило, связывающее числа с измеримым светом. Один и тот же оранжевый – это 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 нет: преобразуйте его – и числа выйдут за допустимый диапазон. Атлас этого не скрывает: плашка рядом с текущим цветом называет самый узкий стандартный охват, который его вмещает, а участки вне диапазона проступают полупрозрачно поверх шахматного фона.
Экран излучает свет; бумага отражает то, что не поглотили её краски. Краске на бумаге доступно меньше ярких цветов – насыщенные синие, зелёные и красные RGB лежат вне её охвата, – поэтому они печатаются тусклее. Допечатная подготовка переводит цвета через ICC-профиль, сделанный для машины и бумаги, например FOGRA39 для европейской мелованной бумаги или GRACoL в США. CMYK этого каталога – простая формула, которой CSS пользуется для device-cmyk() без профиля: верная для чисел, но не цветопроба печати.
Для веба и обмена подходит sRGB: браузеры и телефоны подразумевают его, если в файле нет профиля. Display P3 передаёт больше цветов яркой сцены на экранах Apple и многих Android, пока профиль остаётся встроенным. Отправляйте Adobe RGB, когда его просит фотолаборатория. ProPhoto RGB оставьте для 16-битной обработки: его охват так широк, что в 8-битных файлах появляются полосы на градиентах.
Преобразования вычисляются по аналитическим формулам, а не по приближённым таблицам. При прямом и обратном пересчёте погрешность обычно ограничивается точностью вычислений с плавающей запятой. Исключения указаны в описаниях: у OSA-UCS нет аналитической формулы обратного преобразования, системы вроде Munsell используют интерполяцию между опубликованными образцами. Значения rgb ограничиваются охватом sRGB; для цветов за его пределами используйте XYZ или линейный RGB.
Для каждого пространства указана статья или спецификация, по которой реализовано преобразование. Результаты сверяются с 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). Любой системе, чью математику когда-либо публиковали, место здесь; предложите недостающую.
@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.3.0},
year = {2026}
}Ivanov, D. (2026). color-space (Version 3.3.0) [Computer software]. https://github.com/colorjs/color-space
HDR-изображения в TIFF – 38 порядков величины шагами 0.27% и весь видимый охват в 32 битах на пиксель.
Хранение HDR-изображений в TIFF (сжатие SGILOG, 32-битный LogLuv); устаревшее, но LibTIFF по-прежнему читает и записывает его.
Абсолютные cd/m² – только если в файле есть тег STONITS, а его часто нет.
покомпонентноепривязанное к сценеHDRлогD65
1998, Larson (SGI)
логарифм яркости плюс u′v′ CIE 1976 – цветность Luv, а не L* из CIELUV
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import logluv from 'color-space/logluv.js' logluv.xyz(15818, 81, 192) // → [20.5166, 21.5861, 23.5085] // any-to-any, both ways — the wired hub: import space from 'color-space' space.logluv.rgb(15818, 81, 192) // → [128, 128, 128] space.rgb.logluv(128, 128, 128) // → [15818, 81, 192] // route: logluv → xyz → rgb