色彩空间 Rec. 2020 display

在每个色彩空间中查看颜色、调色板、渐变或图像。从屏幕到印刷,从取色到研究,从 1860 年到 2026 年。

用法

JavaScript

整个库: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 声明随包提供,覆盖整个库,也覆盖单独导入的每个色彩空间。

什么是色彩空间?

颜色的坐标系:坐标轴、取值范围,以及把数值与可测量的光对应起来的规则。人的色觉是三色视觉,有三种视锥细胞(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 一致。

我到底该用哪个空间?

取决于任务:

  • 存储和分享图像——sRGB,网页的默认空间;
  • 设计调色板和渐变——OKLCH,数值等距,视觉上也等距;
  • 需要按真实光强计算的处理(混合、模糊、3D)——线性光 RGB;
  • 视频拍摄与调色——摄影机自带的 Log 空间,以 Rec. 709 或 Rec. 2100 交付;
  • 衡量两种颜色看起来差多少——CIELAB 或 DIN99o。

要按任务查看所有空间,请按 用途 给目录分组。

该用什么替代 HSL?

OKLCH。它同样用三个参数调色——色相、彩度、明度——但明度名副其实:在 HSL 中,L=50 的黄色发出的光约是 L=50 的蓝色的 13 倍,L 相同并不意味着明亮度相同。OKLCH 则不然:L 相同,明亮度也相同。CSS 原生支持 oklch()。

如何把 hex 转换为 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 或其他摄影机 Log 转换为 Rec. 709?

打开你的摄影机所用的 Log 空间,例如 S-Log3、LogC4 或 Apple Log。在它的 LUT 区块中,选择 Rec. 709 和你的剪辑软件:DaVinci Resolve、Premiere Pro、Final Cut Pro、OBS、ffmpeg 等。浏览器会生成 .cube 文件。这是不做色调映射的技术性转换:高于漫射白的高光会被裁切,风格化的影调(look)由你自己添加。

“超出色域”是什么意思?

指一个空间能描述、而另一个空间(或你的屏幕)无法显示的颜色。鲜艳的 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 重叠之处,数值都与之对照测试;摄影机 Log 则与美国电影艺术与科学学院(Academy)官方的 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 伽马,而不是本目录中 Rec. 2020 所用的 BT.2020 曲线——同样的数值会指向不同的颜色。每个空间详情中的 css 标签页都会以可复制的形式写出当前颜色;CSS 不支持的空间则改以 ICC 配置文件或 LUT 提供。

色盲人士眼中的颜色是什么样的?

打开 视图,在 色觉 中选择红色盲、绿色盲或蓝色盲。目录会模拟这种色觉重新绘制,方便你检查调色板中的颜色是否仍然可以区分。据 NEI 统计,约每 12 名男性中就有 1 人有色觉缺陷。

Pantone、NCS、RAL 在哪里?

它们是授权产品:颜色由所有者出售的数据定义,而不是由公开公式定义——因此没有公开的算法可供实现,再分发其色表也不合法。公式公开的同类体系则收录在此:Munsell(其 1943 年的重新标定数据已公开)和 RAL Design(直接在 CIELAB 中定义)。凡是公式公开发表过的体系都可以收录;推荐尚未收录的体系。

替代方案

色彩转换库对比。
工具色彩空间摄影机 Log亮度–色度sRGB工具集大小速度目标平台
color-space20531160–255
parse mix ΔE contrast CVD
62 kBJS, WASM, GL, LUT, ICC, OCIO, MCP, Figma, VS Code, CLI, web
culori30–10–1
parse mix gamut ΔE contrast CVD
23 kBJS
colorjs.io51––0–1
parse mix gamut ΔE contrast
34 kBJS, web
chroma-js11––0–255
parse mix ΔE contrast palettes
17 kBJS
@texel/color16––0–1
parse gamut ΔE
9 kBJS
colour-science1282460–1
ΔE CVD
––Python, LUT
ColorAide77––0–1
parse mix gamut ΔE contrast CVD palettes
––Python
colorspace (R)9––0–1
mix contrast CVD palettes
––R, web
OpenColorIO5711–0–1
gamut
––C++, Python, GL, LUT, ICC
Bruce Lindbloom22––0–1, 0–255
ΔE
––web
oklch.com9––0–255
parse gamut
––web

数据来自各项目自己的源码、软件包或页面,截至 2026-10-18。

已复制