F5.01.3Working color space设计研究
色彩计算应在明确的色彩空间中进行
别名: 工作色空间 · 色彩插值 · color-mix · 线性光混合
概念解释
半透明黑罩在一张暖色卡片上:设计工具给出偏灰的结果,浏览器叠出来却发脏、发绿。两边用的不透明度数字相同,混合发生的空间不同。渐变、平均、叠色、插值都是坐标运算;不声明运算所在的色彩空间,同一组输入可以合法地得到几种外观。这条要的是运算有名字,不是哪一种空间「更正确」。
机制
sRGB 数值经过了伽马编码。把两个编码后的通道直接平均,中间会偏暗——经典的「50% 灰其实不是感知中灰」。物理上更说得通的叠光要在线性光里做,再编码回去。感知上更顺的渐变则常在 Lab 或 OKLab 里插值,因为那里的直线更接近等色差。
空间还会改变轨迹。红与绿在 RGB 里平均趋向暗黄或褐;在 HSV 里绕短弧可能穿过高饱和黄,绕长弧则穿过洋红。CSS 的 color-mix() 之所以要写 in oklab 或 in srgb,就是承认轨迹是选择,不是默认。半透明层叠还受预乘 alpha 和合成色空间影响:同一 40% 黑,在伽马空间与线性空间里压住的明度不同,暖底上就会一个发灰、一个发脏。
怎么研究
固定两个端点色和不透明度,只改运算空间,测量结果的 XYZ 并做配对比较。自变量:空间(伽马 sRGB、线性 sRGB、CIELAB、OKLab、HSV)、插值路径(短弧 / 长弧)、是否预乘。因变量:中点明度、是否穿过无彩色轴、观察者判断「脏 / 灰 / 顺」。
界面里最容易踩坑的是工具链不一致:设计软件用一种合成,运行时用另一种。实验要报告两端用的引擎,而不是只报告色值。
边界
- 两种空间的差异在端点很近时可以忽略;端点跨越大、或经过无彩色轴时才会明显脏掉。
- 游戏和三维渲染以能量守恒为由选择线性光;扁平界面渐变更在意中间档好不好看,二者不必共用一个工作空间。
- 显示链路若在后级又做一遍色彩管理,前端「算对了」仍可能被操作系统改写。
- 声明空间并不能消除色域裁切:算完再夹紧仍会改变中间色。
怎么落地
- 为叠色、渐变、主题插值各指定工作空间,并写进实现,而不是口头约定「用 RGB 混一下」。
- 半透明遮罩、阴影色、玻璃拟态这类会大面积改变底色的运算,优先在线性光或 OKLab 里做,再转回输出色域。
- 不要用 HSV 短弧连接互补色当渐变,除非有意经过高饱和中间色。
- 验证办法:把同一叠色在设计稿和真机截图里用取色器读中点,若系统差稳定出现,先对齐双方的混合空间,再调不透明度。