我们每天都接触屏幕,或多或少都会知道,一个屏幕上显示颜色,靠的是屏幕中每个像素中的 红、绿、蓝 (RGB) 三种原色发光元件。那么想象这样一个问题,纸上是没有发光元件的,打印机是如何在纸上显示色彩的呢?
这个问题的答案,其实就是在颜色模型中。
不过在说颜色模型之前,我们必须先了解一下一切的开始:光。
从光照开始
光,这种东西,是一个很神奇的东西,例如,它既是粒子,也是波动,还有它具有宇宙中最快的、永恒不变的速度。不过对于这篇文章来说,我们只需关心它作为电磁波的一面。
我们人眼能看到的,仅仅是整个电磁波谱中极其狭窄的一部分——可见光。当你看到一束看似“纯净”的阳光时,它其实是各种不同波长的光混合而成的。
不同的波长对应着不同的能量和不同的频率,而当这些不同波长的光线射入我们的眼睛时,它们刺激了我们视网膜上的感光细胞(主要是视锥细胞)。正是这些细胞将光的信号转化为电信号,传递给大脑,我们才感知到了颜色。
例如,波长在 700 nm 附近的光,被大脑解码为红色;波长在 450 nm 附近的光,被解码为蓝色。
也就是说,我们感觉自己看到什么颜色,实际上是我们的大脑对颜色信号的解析结果。这一点要注意,或者说,对同一束光,我们的感知可能不同,例如色盲。甚至,有些人能感知的可见光范围会比常人要大。
总结一下,那就是颜色是我们对光的一种主观体验。因此,颜色的起点并非像素或油墨,而是光线的波长被人眼接收和处理的结果。
光的分解与颜色的组合
当人们发明了屏幕之后,就需要考虑如何在屏幕上显示颜色了,那么有什么办法呢?既然光是不同波长的光的混合,那能不能用精确的波长来描述颜色呢?理论上可以,但是实际上是不可行的。
我们经常能看到这张图片:
这张牛顿的三棱镜将白光分解为很多光线,也表明一个事实:每一种颜色都可以用某些颜色的不同组合来描述。白色是所有颜色的总和,而黑色可以理解为没有颜色。而更加幸运的是,几乎所有的颜色都可以由3种颜色线性组合而成,这3种颜色称为原色。这就是一切颜色模型的基础。
但在细说屏幕的RGB模型之前,我们先回到没有屏幕的时代,看看如何在纸上表示出颜色。
减法模型
我们拿出一张白纸和红、黄、蓝3种颜色的蜡笔。我们先画一个黄色的圆,然后画一个蓝色的圆与它重叠,这样就得到了绿色。同理,黄色和红色重叠就会得到橙色,红色和蓝色重叠,就会得到紫色;将三者混合在一起,就会得到一种很暗的颜色。
下图展示了这些颜色的叠加效果:
物体的颜色
不同的物体有不同的颜色,因为它们吸收和反射光的方式不同。白光包含各种不同的光。当光照射到一个物体表面时,物体的表面会吸收一部分波长的光,反射其他部分波长的光。这些反射光进入我们的眼睛,然后大脑将其转换成颜色,才形成了我们对物体的颜色的感知。
为什么叫减法模型
我们先拿出的白纸,因为是白纸,它不吸收接收的光,而是将所有光反射,所以我们才能看到纸是白色的。当我们用黄色蜡笔画圆时,就是在这张纸上添加了一层材料,这层材料可以吸收一部分波长的光,但会让其他波长的光通过。通过的光传到我们的眼睛里,被大脑解析为黄色。这层材料的作用就是从原始白光中减去一部分波长的光。
我们可以把每种颜色的圆看做一个滤波器:当我们画一个蓝色圆叠加到黄色圆上面的时候,相当于从原来的光中过滤掉了更多波长的光,所以进入我们眼睛的是那些没有被蓝色或黄色的圆过滤掉的波长的光,我们的大脑认为是这部分光是绿色的。
总之,我们从包含所有波长的光开始,减去一部分数量的原色,从而创建任何其他颜色。这种颜色模型的名字就来源于我们通过减去其中一部分波长的光来创造颜色这样一个事实。
真正的减法模型 CMYK
上面我们使用了RGB来作为减法模型的原色,但是实际使用时,减法模型的原色是青色(cyan)、品红色(magenta)和黄色(yellow)。此外,混合这3种原色会产生一种很暗的颜色,但不是完全的黑色,因此需要添加纯黑色作为第四种原色。不过由于 B 已经用于表示蓝色,所以黑色(black)用 K 表示,这样我们就得到了 CMYK 颜色模型。
这也是打印机使用的颜色模型:
加法模型
上面说到在纸上用的减法模型,因为白纸就是白色的,能反射所有波长的光,所以要显示颜色,我们就从反射的光中减去不想要的波长的光。而屏幕与白纸恰恰相反,屏幕本身是黑色的,所以我们必须从没有光开始,然后添加我们想要的波长的光。
与减法模型的 CMYK 不同,加法模型需要使用不同的原色,这就是 RGB。这是因为大多数颜色都可以通过在黑色表面上添加不同强度的红色(red)、绿色(green)和蓝色(blue)来创建,也就是RGB 颜色模型。
加法模型的原色混合后会产生更亮的颜色,直至亮成白色;而减法模型的原色混合后会产生更暗的颜色,直至暗成黑色。
屏幕上的RGB
现在我们知道屏幕使用RGB加法模型来显示颜色,每一个像素中都包含RGB三种发光元件,通过以不同的强度点亮这些元件,就可以创造出不同的颜色。
那么我们能产生多少种颜色呢?
现如今我们看到的大多数图像都是使用8位二进制数来表示一种原色,也就是颜色通道。由于每个原色通道使用8位二进制,那么颜色总数将会是 2 的 24 次方,大约为 1670万种颜色。这种格式,我们称之为 RGB888。因为一个颜色共使用24位二进制,因此我们认为这种格式的颜色深度为24位。
在 Windows 系统中,可以通过在设置中看到当前的屏幕的颜色深度:
但这不是唯一的格式,为了节省内存,RGB565 可能在某些场景下更受程序员的欢迎。RGB565 格式为红色和蓝色通道分配了5位,而对绿色分配了6位。这样就可以用两个字节来表示一个颜色,可表示的颜色总数就是 2 的 16 次方,大约为 65000种颜色。这里绿色通道得到了额外的1位,是因为我们的 眼睛对于绿色的变化更敏感一些。
尽管65000种颜色已经足够了,但对于颜色变化非常缓慢的图像,我们将能够看到非常微妙的阶梯现象。对于这种情况,就要考虑使用 RGB888 了。
总结
至此,我们从光开始,解释了颜色的本质、减法模型(CMYK)和加法模型(RGB)。而从本质上来说,这些颜色模型就是对光的模拟和抽象。
屏幕通过 RGB 加法模型,用发光元件直接模拟了人眼感知到的光线;而打印机则通过 CMYK 减法模型,利用油墨吸收和反射光线,间接模拟出色彩。最终,无论是哪种模型,它们都需要一套通用的数字语言才能在计算机世界中精确传递和重现,这就是 RGB 编码。
有了这些,才使得计算机能以最高效、精准的方式,模拟出我们所见的光与色彩的奇妙世界。
好了,感谢诸位的阅读,愿你也能成为光!