关于颜色格式的一些心得

来源:互联网 发布:wifi信号增强软件 编辑:程序博客网 时间:2024/05/17 06:58

大自然中的颜色和计算机世界里的颜色,颇有许多相似之处,甚至可以说计算机世界里的颜色就是来自大自然的。我记得我的一位师长曾对我说:“科学源于生活又低于生活,艺术源于生活而高于生活”。现在想起来,似乎真的是这个样子。

大自然中的颜色有多少种呢?

不知道唉,可以说是无数种了。

不过既然科学源于生活又低于生活,那么计算机中的颜色肯定就少于无数种(作者废话,被暴打中.......)

一般我们的计算机的颜色,通常有两种格式,一种是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是怎样一种格式,你可以在百度上搜索一下

会有很多收获的。

水平有限,如有不妥之处,请达人不吝赐教。

原创粉丝点击