色彩空间与取色器错误

本文约 1200 字,阅读需 3 分钟。

背景

同事反馈,用我们的框架绘制了一个纯红色(RGB为#FF0000)的区域,使用取色器却无法取到正确的值,其他颜色也基本都会有一定程度的误差。 我尝试了一下,确实会出现这个情况,这里的取色器可以是:

取色错误 图1

首先,通过“一次只改一个地方”的思想,用系统的预览工具(图1)证明了,不仅仅是我们的场景会出现问题,使用系统的工具绘制一个纯红色也会出现同样的情况。

分析

这个问题,如果知道色彩空间(Color Space)的存在,还是比较容易定位的。关于色彩空间,可以讲很多,在此不做详述,简单来说,色彩空间是与硬件能力和软件配置相关的,对于同样一个RGB的值,不同色彩空间的实际表现是不一样的,如图2:

色彩空间 图21

而我们的开发机都是iMac台式机,其支持Display P3标准,默认用的是iMac配置,和Display P3非常接近。 事实上,如果我把显式器设置为sRGB(如图3),那么取色器将返回预期的值#FF0000

颜色描述文件 图3

那么,现在还有两个问题:

  1. 为什么系统的取色器会返回 #E73323 这个值
  2. 为什么在线网站(三方工具)返回的是 #FF0200 这个值

这其实就是因为“编码和解码”的算法不一致。大部分绘图工具使用的都是sRGB,那么当实际渲染目标是iMac时,由于#FF0000在sRGB下显示的效果和#E73323在iMac(色彩空间配置,下同)下显示的效果是最接近的,系统取色器使用iMac的配置“解码”,自然得出了这个值。

而对于三方工具,则是使用sRGB解码的,为什么也会有一点误差呢?其实是因为不同颜色空间下转换的误差导致的。即#E73323在iMac下显示的效果和#FF0200在sRGB下显示的效果是最接近的。我们可以通过系统的“色彩同步工具-计算器”验证:

计算器 图4

实际上,对于同样一个红色块,当处于三块不同的屏幕时,三方取色工具的值是不同的:

  • iMac原生屏:#FF0200
  • AOC外接显示器:#FF0100
  • Dell外接显示器:#FF0000

这就是因为每块屏幕的色彩空间不同导致的。实际上,我们可以用系统的“数码测色计”,用不同显示模式取色:

数码测色计 图5

总结

  • 如果软件要提供取色功能,最好自己提供,保证不受硬件影响
  • 如果要提供更好的体验,可以针对不同色彩空间做适配,发挥硬件的最大性能。比如PS和一些成熟的设计软件就支持
  • 目前大多数屏幕还是只支持sRGB,Windows下应该很难出现这个Bug(即使高配的外接显示器也可能降级成sRGB配置)

下面这张图,如果能看到全部3个隐藏的图形(最好在白色背景下查看),说明的你的显示器拥有P3级的色域。

P3测试图 图61

总阅读量次。