OKLCH 色彩空间是搭建色彩系统的最佳选择


在千万种色彩中,如何快速选择出最合适的色彩?

总结

背景

最佳实践

Recommend OKLCH

顾巍,Design Director,目前供职于小影。

最近更新:2023年8月


当设计师在挑选色彩的时候,我们究竟是在做什么?

Some various color pickers

在各种设计软件中有那么多挑选色彩的工具,我们的选择过程本质上包括了:

色彩空间(Color Space)是色彩的特定组合范围,其中两个主要特征对应了我们挑选色彩的过程。

第一点是「色域」,指明了该色彩空间所包含的全部色彩值域,通常表示为与人眼可视色彩范围的关系。

CIE 1931 xyY Gamut Comparison CIE 1931 xy GAMUT COMPARISON Myndex Research (CC) ProPhoto RGB Adobe RGB Rec709 sRGB D65 white point ~6300 white point Rec2020 P3 P3 460nm 480nm 460nm 480nm 500nm 520nm 540nm 560nm 580nm 600nm 620nm x 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 y 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

第二点是解释色彩时使用的分量,也可以理解为在色彩虚拟空间中的坐标关系。

RGB gamut and HSL gamut

除此之外,一些色彩空间的定义还包含了「白点」、「伽马校正」等,与本篇关系不大,暂且略过。

那我们该选择哪个色彩空间?


RGB 是对机器友好的色彩模型,对人类并不友好

RGB 颜色模型,由红、绿、蓝三原色叠加组合定义。

现代电子设备的主要显示机制就是通过红、绿、蓝的电子元件分别发光组合出单个像素所对应的颜色。对于每个发光元件来说,只需要处理自己所对应的 R、G、B 分量数值来决定自身的发光亮度,而无需复杂的运算。

RGB 色彩模型为了在不同的设备中对比和转换,通过定义白点和伽马校正,形成不同的色彩空间。常见的有 sRGB、Display P3、Adobe RGB 等。

sRGB(包括 Hex 格式)是我们最常见、也可能是应用最广泛的色彩空间,目前是 Web 的默认设置,支持绝大多数的显示设备,常见的表示方式是rgb(255, 255, 255)#FFFFFF

但是人类的识别和使用却十分困难,我们难以在直觉上得出 RGB 三色分量的混合结果,只有在特定情况下(比如纯色)才比较容易理解。

rgb(131, 103, 210)/#8367D2 是以下哪个色彩?

4 colorful blocks

虽然有经验的设计师可以通过一些评估过程得出正确的答案,但很难说这个过程是值得的。

另外基于 RGB 的渐变色,中间部分可能会由于分量数值接近导致色彩饱和度降低,显得灰暗。

RGB gradient

结论

⛔️ RGB 色彩模型难以直接识别和对比

⛔️ RGB 色彩模型经常需要三个分量同时调整,过程复杂

⛔️ 基于 RGB 的渐变色,中间部分会丢失饱和度

PS:CMYK 是对印刷友好的色彩模型,同样对人类不友好


HSL 的亮度值与眼睛的感知不一样

设计师常用的 HSL 色彩空间,是 RGB 色彩模型的特定坐标转换结果。

采用「色相 H - 饱和度 S - 亮度 L」三个分量映射 RGB 色彩模型中的对应色彩,优化了实践中常见的饱和度、亮度的选择和调整过程,更加自然、符合直觉、容易理解。

常见的表示方式是hsl(360deg, 100%, 50%)

HSL Color Picker

在 HSL 色彩空间中,调整色相 H 展示从hsl(0deg, 100%, 50%)hsl(360deg, 100%, 50%)的渐变,就是设计师选择色相时常见的「彩虹条」。

HSL form Hue 0 to Hue 360

由于人类的视觉感知并不是均匀的,色彩的波长在人类的三种视锥细胞的影响力不同,我们发现彩虹条上的一些颜色更亮,而一些较暗。

去掉饱和度,更直观地看出在黄色到绿色区间显著更亮,而在蓝色的区间更暗。

HSL form Hue 0 to Hue 360 with desaturate

计算感知亮度发现:最亮处有92.8,而最暗处只有7.2。

HSL form Hue 0 to Hue 360 with luminance

基于 HSL 建立的调色板,在感官上同一等级差异太大。

a palette based on HSL

基于 HSL 的渐变色,由于各个色相的感知亮度不均匀,可能发生非预期的变化。

Some various color pickers

❓ 绿色hsl(90deg, 100%, 50%)与紫色hsl(270deg, 100%, 50%)的亮度到底差了多少?

2 HSL color background

与同一个背景上的紫色文字相比,同样 HSL 亮度的绿色文字很难看清。

2 HSL color body

结论

⛔️ HSL 的亮度分量在感知上不均匀,难以评估色彩可访问性

⛔️ 当 HSL 色相偏移时,感知亮度也会发生非预期的变化

PS:HSV(HSB)是另一种 RGB 色彩模型的变换,与 HSL 情况基本一致


HCL 是最佳候选之一,但还是有一些小瑕疵

CIELAB 色彩空间是国际照明委员会于1976年定义,最大的特征是定义感知亮度 L 分量,尽可能匹配人类对亮度的感知。

但另外两个分量 a、b 分别代表红绿程度、蓝黄程度,与 RGB 色彩模型类似,不太符合使用直觉。

我们希望像 HSL 一样,通过易于理解的色相、饱和度来使用 CIELAB 色彩空间,这就有了 HCL。

Convert from LAB to LCH

HCL 色彩空间(Hue-Chroma-Luminance,也可调整顺序为 LCH)是 CIELAB 的极坐标转换。通过「色相 H - 色度 C - 感知亮度 L」三个分量从人类视觉感知的角度描述颜色,形成数值与感知相对统一的色彩空间。

常见的表示方式是hcl(360, 40, 75)lch(75% 40 360)

下面是 L=75 时的 HCL 示例,去掉色度后更容易看出色彩具备感知均匀性。

LCH form Hue 0 to Hue 360 LCH form Hue 0 to Hue 360 with desaturate

当我们设置 L 为相同的数值时,得出的效果也近似。

2 HSL color body

基于 HCL 建立的调色板,能够比较准确的反映色彩级别,可以轻易地更换色相。

a palette based on HCL

在渐变色方面,HCL 的表现也十分稳定。

Some various color pickers

虽然 HCL 已经近乎满足了所有需求,但我们还是低估了色彩的复杂性。

亥姆霍兹-科尔劳施效应(Helmholtz—Kohlrausch effect)指出强烈的色度会影响视觉感知。即便在光源亮度一样的情况下,对于人类视觉来说,彩色光也似乎比白光更亮。

例如下图中所有色彩的 L=54,但我们发现色度更高的色彩 1 和色彩 4 似乎更亮。

Helmholtz–Kohlrausch effect

阿布尼效应(Abney effect)指出当白色光叠加到单色光时发生的感知色相偏移。例如#460FF2叠加#FFFFFF后颜色会呈现偏紫色。

Abney effect

HCL 色彩空间中有同样的问题,例如 H=303 时,L 从 0 到 100 也呈现从蓝变紫的色相偏移。

Abney effect on HCL

结论

⛔️ HCL 在部分色相区域会发生色调偏移

⛔️ 强烈的色度会影响亮度感知,HCL 面对色度变化时感知亮度不太均匀

PS:CIELuv 及其转换形式 HSLuv 情况基本一致,但兼容和支持场景更少


OKLCH 基本解决了以上所有问题

OKLCH 色彩空间(Lightness-Chromacity-Hue) 是 OKLAB 的极坐标转换。由 Björn Ottosson 于 2020 年创建,基于感知更为均匀的 CAM16-UCS 色彩空间和计算模式简单的 IPT 色彩空间。

常见的表示方式是oklch(``75% 0.1 360``)oklch(0.75, 0.1, 360)

✅ OKLCH 使用「感知亮度 L - 色度 C - 色相 H」三个易于理解的分量

感知亮度 Lightness

范围是 0 到 100%,0%是#000000纯黑,100%是#FFFFFF纯白。

OKLCH Lightness

色度 Chromacity

OKLCH 理论支持的色度没有上限,但对应到 sRGB 或 P3 的色域部分不高于 0.37,对应到 Rec2020 的色域部分不高于 0.47。

这里遗憾的是,虽然色度数值表现是均匀的,但不同色相的色度上限范围差异较大。

OKLCH Chromacity

以映射到 sRGB 色域为例:

OKLCH Chromacity on sRGB

色相 Hue

使用方法与 HSL 基本一致,范围是 0 到 360。

OKLCH Hue

✅ OKLCH 感知亮度均匀

下面是 L=75 时的 OKLCH 示例。

OKLCH form Hue 0 to Hue 360 OKLCH form Hue 0 to Hue 360 with desaturate

基于 OKLCH 的渐变色变化,对比 HCL 还要更均匀。

Some various color pickers

✅ OKLCH 尽可能降低色度对亮度的影响(亥姆霍兹-科尔劳施效应)

OKLCH 降低了高色度的亮度,提高了低色度的亮度。

Helmholtz–Kohlrausch effect

✅ OKLCH 尽可能修复了色相偏移(阿布尼效应)

Abney effect LCH vs OKLCH Abney effect on OKLCH

✅ OKLCH 支持为更广的色域提供编码支持(P3、Rec.2020及更高版本)

比较有实际意义的主要是 Apple 的 Display P3,近几年的 iPhone、iPad(除了入门款)、MacBook 已经全部支持,比 sRGB 的色彩范围几乎大了25%。

从长远来看,OKLCH 是基于人眼的全可视范围制定的,也就意味着兼容未来的设备色域。

使用 OKLCH 等广色域色彩空间能够更好地为新设备带来更好的体验。

sRGB in white compared to Apple P3 in black

oklch()已经加入目前 CSS4 的候选版本,主流浏览器均已支持

具体进度参考 W3 工作组的 CSS Color Module Level 4 候选内容。

OKLCH color model browser support

与其他较新的色彩空间相比,生态兼容和支持的速度飞快。

⛔️ OKLCH 的不足之处

PS:HCT 色彩空间是 Google 在 Material Design 3.0 中推出的新方案,基于 CAM16 色彩空间与Lab 色彩空间进行了改善,目前实现相对复杂,也值得持续关注。


在 OKLCH 空间中选择颜色

我们以OKLCH Color Picker & Converter为例。

https://oklch.com/#75,0.1,300,100

oklch.com tutorial
  1. 亮度 L 输入
  2. 色度 C 输入
  3. 色相 H 输入
  4. 输出颜色

一般来说,我们会先选好色相 H,设定好 L 梯级,最后在受限的色度范围内选择你所偏好的色彩。

a palette based on OKLCH

需要注意由于 sRGB 的色域小于 OKLCH,超出范围的颜色可能无法在你的设备上显示。

OKLCH color gamut matching

我的 Figma 色彩插件上线了- Palette lap


下一步

OKLCH 目前发展势头很强,在新一代的色彩方案里几乎确认占有一席之地。

如果你正在搭建或重构色彩系统,OKLCH 一定是最佳选择之一。

本文主要是着重在介绍和推荐选择哪一个色彩空间,如果想要搭建完整的色彩系统,可以期待后续的文章。

感谢阅读。


资源

参考文章

工具


更新记录