RGB模型
RGB模型是什么在这里就不介绍了,主要来谈谈RGB的格式.
RGB是是从颜色发光的原理来设计定的,RGB模型分成了三个颜色通道红(R)、绿(G)、蓝(B),RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色,每个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。
在RGB格式包括RGB1,RGB2,RGB4,RGB8,RGB16,RGB24,RGB32,RGB36.在其中,RGB1、RGB2,RGB4,RGB8为调色板类型的RGB格式(如RGB111,RGB222,RGB233等).RGB16为高彩色Hi Color(如RGB444,RGB555,RGB565),RGB24为真彩色TRUE Color(如RGB888等),RGB32则带Aphal通道(RGBA)(注:RGBX等是指一个像素用多少位表示,比如RGB1它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色),那么图像数据001101010111…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…),另外类似RGB -565这些是指R与B对调。
先看下比较少位的RGB。单个像素位小于或等于8位的,因为不能完全表示所有的RGB颜色,所以在其中使用了调色板这个概念。那什么是调色板呢?
以WINDOWS系统为例,不是真彩色的位图都含有颜色索引表,在显示时可以采用调色板技术,将文件中自带的颜色显示出来。调色板是一组独立于存储各个像素颜色编号存储区的视频存储区。为了确定每个颜色编号所对应的真实颜色,显示硬件要参考调色板的颜色值。在调色板颜色系统中,每一幅图像都有自己的调色板,显示时必须将自己的调色板载入系统调色板中,实现调色板。下图为一个调色板例子(16色位)
0…15为调色板的index
对于Hi Color的RGB16,16位的RGB像素点数据还是直接的颜色索引值,并非RGB的颜色值,因为带有64K色,如果用调色板则会导致占据的空间过大, 所以不使用调色板,而是通过转换算法,如RGB444,RGB565,RGB555等。
RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:
高字节 低字节
R R R R R G G G G G G B B B B B
RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
高字节 低字节
X R R R R R G G G G G B B B B B (X表示不用,可以忽略)
颜色索引值到RGB值的转换,索引转换成RGB的基本原理,首先,对于RGB三值,由FixedPalette指定其每个位所占的位数,如为444则各4位. FixedPalette中指定能表示的RGB的范围分别为(R,G,B)1111/1111/1111,即16(R)/16(G)/16(B). 则当索引值Index为444时,则是RGB各值索引最大的时候,由此即可分析,R/G/B三值要表示的颜色范围是0x00-0xff,为了让有限的0-16的索引来表示0x00-0xff这些颜色值, 那么当然只能是跳隔着来表示,拿R来说,最好是取值为(17*0, 17*1,17*2,17*3,...17*15=248),如此的话,才能差不多在有限的16个索引值下将0xff种颜色最大程度的涵盖到(比较平均),但实际你可以自己控制索引到RGB颜色值的转换算法,但一定要合理,尽可能涵盖全面。 同理,对于FixedPalette为555时,则R取值最好为(8*0,8*1,8*2,
8*3,...8*31=243)...
同理,对于FixedPalette为565时,则B取值最好为(4*0,4*1,4*2,
4*3,...4*63=252)
下面为一个例子:RGB444
RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。
RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。