色彩的表示


在开始给你介绍颜色编码之前,我想让你回忆起小时候用颜料画画的场景。假如你在画一幅草地和蓝天的画,你用黄色画了金黄的太阳,又用蓝色渲染了一片浅蓝的天空。这时候,你想铺上绿油油的草地,结果你却发现,手头没有绿色颜料!于是你灵机一动,开始试着混合你手头有的颜料……终于,你发现了,蓝色和黄色混起来可以得到绿色!

通过直观的感受,我想每一个人都会明白颜料之间混合可以得到更多不同的颜色。那么颜色到底是什么呢?这一切还要从四百年前牛顿的时代说起。

牛顿和分光实验

在科学技术还不发达的年代,人们普遍认为白色光是一种“单纯的光”,而彩色光则是一种“不知道发生了什么变化的光”。但富有科学精神的科学家牛顿(Issac Newton)决定对光进行更深入的研究,他写道:

1666 年初,我做了一个三角形的玻璃棱柱镜,利用它来研究光的颜色。为此,我把房间里弄成漆墨的,在窗户上做一个小孔,让适量的日光射进来。我又把棱镜放在光的入口处,使折射的光能够射到对面的墙上去,当我第一次看到由此而产生的鲜明强烈的光色时,使我感到极大的愉快。

这就是著名的牛顿分光实验。通过这个实验,牛顿在墙上看到了一个彩色光斑,颜色的排列是红、橙、黄、绿、蓝、靛、紫。牛顿把这种现象叫做光的色散,把这个颜色光斑叫做光谱。而通过进一步的实验,牛顿确定了每一种单色的色光都是纯净的,三棱镜只是分解了光线,而不是了改变了它的性质。

颜色的产生

1801 年,英国学者汤玛士‧杨格首先研究人眼对颜色的感觉。他指出在可见光谱的位置排列上,只需选择三种彼此有相当差距的基本色光,按不同的比例组合,几乎可产生任何一种颜色。随后德国学者赫尔曼·冯·亥姆霍兹在 1856 年至 1867 年,继续深入对颜色的研究,确立了光的三原色理论。

如今我们通常选择的三原色是红色、绿色和蓝色。当红光、蓝光和绿光以同一亮度混合时,我们就得到了白色。虽然理论上我们可以选择其他三种颜色作为原色,但在电脑显示屏上,红绿蓝能最大地达到人的色彩空间。

RGB 表示

刚才我们说到,颜色可以由红、绿和蓝三种颜色来表示,因此,只要我们想办法控制红绿蓝的比例,我们就能显示出缤纷多彩的颜色。

平时买手机、显示屏的时候我们常常会了解一个参数——分辨率,就好像 1920 x 1080 这样的参数。那么它意味着什么呢?如果我们用放大镜(或者显微镜)仔细看你的显示屏,耐心数数,就会发现横向有 1920 个,纵向有 1080 个发光点。而小小的发光点,我们称之为像素,如果我们再更近距离地观察像素,就会发现,它其实是由红绿蓝三种颜色构成的。

上面的图片就是你的显示屏里最微小的发光部件了。而在电脑里,RGB (Red Green Blue) 便是用来控制这三个小发光点的值,取值范围是 \(0\sim 255\),代表了它的亮度,从不发光,到最亮。这样,我们就能表示 \(256^3=16777216\) 种不同的颜色了。

这里是一个小 Demo,试着拖动一下滑块看看颜色的变化吧!

这里插两句,为什么是 \(0\sim 255\) 呢?因为这正好是一个字节(也就是八个二进制位)所能表示的最大的数,便于计算机存储。那为什么不是 \(2^{16}-1=65535\) 甚至更大呢?因为科学家们发现,对于人眼而言,\(16777216\) 种颜色已经足够丰富,甚至超出了人眼的辨别范围了,用更多的存储位数是浪费空间了。而如果我们用四位存储一种颜色,就只能表示 \(16^3=4096\) 种颜色,又显得太少了,所以最终人们确定用八位,来存储 RGB 的每一个值。

不过遗憾的是,每一个显示器厂家对红绿蓝色的定义不一定相同,也就造成了不同显示器之间的色差。就这样,带着一点小遗憾,人们解决了怎样显示不同颜色的事情。

印刷与 CMYK

但是,当人们想把电脑的照片打印下来的时候,却发现,如果按照 RGB 值混合墨水,得到的和显示的完全不一样,本来是白色的,却变成了黑色!为什么呢?因为 RGB 是表示光的混合,光的混合是一种加法混合,而颜料的混合是减法混合,什么意思呢?这里放两张图片让你直观了解一下:

左边便是光的加法混合,而右边则是颜料的减法混合,差别还是很大的。而且我们发现,要是想得到黑色,那可要费掉不少墨水!于是人们规定了印刷用的 CMYK 表示,CMYK 分别是 Cyan(青色),Magenta(品红色),Yellow(黄色),blacK(黑色,不用 B 是因为 B 已经代表了蓝色)。

CMYK 则使用了 \(0\sim100\%\) 的表示方法来表示每一个分量,这样们就有\(101^3+101=1030402\)可以印刷的颜色。我们可以发现,CMYK 表示的颜色远远少于 RGB 可以表示的颜色,更不用说实际上颜料的品质不可能 100% 完美,所以从显示器到印刷成品,往往有较大的色差。

还有更多!

当然,随着研究和应用的发展,人们在 RGB 和 CMYK 以外还定义了更多的颜色表示方法,比如 HSL、HSV、YUV 等等等等,它们有着各自便利的一面。这篇文章仅仅是抛砖引玉,如果想要了解更多,欢迎大家自己搜索了解更多关于颜色编码的知识!