前面的文章虽然有提到颜色,有提到三原色和亮度,但实际上并没有说它是怎么得出来的。我们知道五颜六色的缤纷色彩是三原色组合的,但是具体是怎么组合的,却没有讲。本次,我们就来讨论一下到底颜色是怎么得出来的。
说到颜色合成,就必须说一说颜色加色法,或颜色加法。所谓的颜色加法,就是将三原色按不同数量进行混合,即相加,就可以得到其它的色。先上图吧:
这个就是颜色相加的结果,也是四条公式
红色+绿色=黄色
红色+蓝色=品红
蓝色+绿色=青色
红+绿+蓝=白色
嗯。这四个公式很重要。为什么呢。因为下面我将要详细进行说明。事实上这几个公式,只要接触图像或颜色,基本都需要清楚。并且可以通过观看颜色可以粗略的判断出颜色的值。
虽然在上一篇文章中,我们分析了BMP格式的数据构成。而在上上一篇中,我也讲了三原色,但是在上面的数据时,我没有真实的去给大家分板每一个数据是什么颜色。又为什么这 个颜色。那么这一节我们将对数据来进行分析。其实只需要简单分析一下就能理解了。
上图是格式加数据,真实数据是从2C,61,54;31,66,59;35,6A,5D;34,69,5C;那我们就来分析这几个数据。首先,我们有说是三原色,存储时即三个字节,所以这几组数据也就代表了4个像素的数据。以2c,61,54;分别代表好像应该是R:2C G:61 B:54,但要纠正一点,千万别搞错了,正确值是B:2C G:61 R:54。即BGR模式。为什么是这样呢。这是因为存储模式造成的。准确的说,一个rgb值的十六进制是:0xrrggbb形式。前红绿蓝,但到了存储就倒过来了。因为存储是小端模式。关于这个大端小端问题大家可以自己百度一下。本质上就是存储的正序与倒序问题。而我们的BMP采用的是倒序。所以成了BGR模式。好了,我们再来验证一下。另外还有一点要补充,也是重点中的重点。即BMP是按倒序的行模式存储的。这一点不搞清楚也是很痛苦的。还是上一个图吧。
这个是我们看到的方式,即从左到右,从上到下的值。但存储却不是这样。
存储却是按下图的方式来的。即Y轴的行完全倒过来了。所以在写程序解析图像进必须按倒序来读。
搞清楚这一点了,事情就比较好办了。再上以前的图:
我们在photoshop下,将原图放大1600倍。就可以看到图像的色块。
这是右下角的600倍值。
这是1600倍。我们放大这么多倍是为了更好的看到颜色的值。看到左边标尺的值没,已经是1438到底了,因一个数字有两个格子即1438,1439.因为是从0起到1439,所以是1440行。即到了最后一行。
好了,我们看回刚才提到的四个像素颜色值吧。2C,61,54;31,66,59;35,6A,5D;34,69,5C; 因为这个是十六进制数,换成10进制则是:
B:44 G:97 R:84,
B:49 G:102 R:89;
B:53 G:106 R:93;
B:52 G:105 R:92。
好接下来我们将直接展示它们的值。
从上面的信息也看得出,第一,图像中四个像素主要色还是以绿色为主,且整体偏暗,所以三个色值都不高只有一半不到的值。所谓颜色加色就是将不同的通道设置不同的值就可以得到混合的色。
至此关于颜色就基本上讲完了。一般情况下,如果懂C语言的文件操作的话,基本上可能做到能读取操作这些像素了。下一篇将直接由代码进行读取。整个难度较低。