大自然中的颜色和计算机世界里的颜色,颇有许多相似之处,甚至可以说计算机世界里的颜色就是来自大自然的。我记得我的一位师长曾对我说:“科学源于生活又低于生活,艺术源于生活而高于生活”。现在想起来,似乎真的是这个样子。
大自然中的颜色有多少种呢?
不知道唉,可以说是无数种了。
不过既然科学源于生活又低于生活,那么计算机中的颜色肯定就少于无数种(作者废话,被暴打中.......)
一般我们的计算机的颜色,通常有两种格式,一种是16bit格式,一种是32bit格式。
打开显示属性面板,在“setting”里看Color quality就会发现你计算机支持的颜色格式了,我的计算机显示Medium(16 bit)和Hightest(32bit)两种,有些计算机也许还可能显示Low(8bit)吧。
关于8bit和小于8bit的颜色格式,设计到调色板问题,个人认为现在的计算机配置都很高,所以不用调色板也完全可以,所以不说了(其实自己也不知道调色板到底怎么回事)
16bit格式有两种
565 format: RRRR RGGG GGGB BBBB(从左到右,内存地址减小,和下面所说的顺序相反)
555 format: 0RRR RRGG GGGB BBBB
不同的显卡支持的格式不太一样,如果在16bit格式下编写涉及颜色的程序的话,
最好提前知道显卡支持的格式类型,免得赋值的时候出错。
我知道一种方法就是DirectDraw7里面有一个GetPixelFormat的函数,可以得到当前显卡支持的颜色格式。不过,我们通常的颜色操作都是在32bit 下进行的。
这里存在这一种24bit的格式,实际上,单纯的从颜色深度的角度讲,24bit 和32bit是一样的,只是32bit的格式比24bit多了一个阿拉法位,如果用Direct3D编写游戏,会用到这一位,一般编写2维的程序,是用不到的。而且在计算机的世界里,3可是一个很讨厌的数字,即使一个数字只需要3个字节,可实际上在内存里面,实际上也是占4个字节的。
在微软提供的开发平台VS.net环境下
经常会遇到如下几种设计到颜色的格式和宏
名称 | 类型 | 字节 | 定义 | 格式(内存中,从左到右,地址增大) |
COLORREF | 32bit整数 | 4 | R G B 0 | |
RGB | 宏 | 3 | (b<<16|g<<8|r) | R G B 0 |
RGBQUAD | 结构体 | 4 | 成员变量为rgbBlue rgbGreen , rgbRed , rgbReserved | B G R Re |
RGB_24 | 宏 | 3 | (r<<16|g<<8|b) | B G R 0 |
RGB_32 | 宏 | 4 | (a<<24|r<<16|g<<8|b) | B G R A |
可以看出,虽然都是表示颜色的值,但是在内存里存储的方式确实不一样的,
我上面所列出的格式,是按照内存地址从小到大的顺序列出的,
以RGB_32为例,其中 B分量的所在字节的地址值是最小的,而A分量的字节的地址值比B分量的地址大3个值,上面所列出的值大致分为两大阵营,前两个是一个阵营,后三个是一个阵营,因为他们在内存里的存储顺序的不同,所以如果用的地方不对,就会出错。
就我的经验来看,如果用CDC编写程序,用第一阵营的两个颜色表达方式,如果用DirectDraw编写程序,用RGB_24这种格式,比如
buffer 这种锁定操作,直接赋RGB_24就非常的方便了,你如果赋的是RGB,那么除非把 r,g,b的顺序颠倒一下,否则,得到的颜色,肯定不是你想要的(rgb三个分量相等除外)
如果用Direct3D编程,那么也许RGB_32是个不错的选择,不过我还没用过
如果对一个bmp文件(现在大多数的bmp都是24bit的)进行读取操作,那么我建议用
RGBQUAD,因为它是一个结构体,可以直接把每一个字节的值赋给相应分量的值,使用起来很方便的
另外在这罗嗦一句,关于24- bit bmp文件的颜色存储格式,如果你已经把文件的所以数据读到内存里面了,
那么,每一个象素点,在内存中的存储格式为 b g r
有人会问了,那么这岂不是只有3个字节么?不是和上面所说的矛盾了?
其实这些点在内存中是连续存储的,实际的格式是 b g r b g r ........
如果一个bmp文件的象素大小是nWidth*nHeight的话,
那么象素矩阵实际上占的字节数是:(((nWidth+31)>>4)<<4)*nHeight
所以,无论象素大小是多少,所占内存的大小始终是16的倍数的
当然,我这么说可能对于初学者还是不太明白,到底bmp是怎样一种格式,你可以在百度上搜索一下
会有很多收获的。
水平有限,如有不妥之处,请达人不吝赐教。