参考资料

颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光。
说人话,用数字来表示颜色,让计算机“理解”颜色,常见的颜色模型有:

  • RGB颜色模型
  • YUV颜色模型
  • HSI颜色模型
  • CMYK颜色模型
  • HSL颜色模型
  • HSB颜色模型
  • Ycc颜色模型
  • XYZ颜色模型
  • Lab颜色模型

不同的颜色模型,适用于不同的需求,比如RGB颜色模型是硬件上最容易实现的模型,一般显示器就采用RGB标准,YUV颜色模型则是用于数据的传输,相同数据下,YUV格式要比RGB格式小的多。
这里学习一下RGB颜色模型,计算机的显示器都是采用的RGB标准(最终的纹理数据其实就是RGBA数据)。

RGB

通过R(red)、G(green)、B(blue)三原色以不同的比例混合来表示颜色。这个标准几乎包括了人类视力所能感知的所有颜色,是最通用的面向硬件的色彩空间模型,因为在硬件上最容易实现,通过电子枪打在屏幕的红绿蓝磷光材料而产生色彩,大部分的显示器包括所有的计算机显示器都是采用RGB标准。可以用一个立方体来描述RGB:
cocos2dx_颜色模型(Color Model) - 图1
根据每个色值分量的比例不同可以分为以下几种类型:

RGB555

16位RGB格式,用16bit来表示一个像素,每个分量都是5bit大小,剩下1bit不用。总共可以表示2(约3万)种颜色。
在程序中通常使用一个字(WORD)来操作,一般一个WORD是2个字节大小,具体如下:

  1. // |高字节 低字节|
  2. // X R R R R R G G G G G B B B B B (X表示不用,可以忽略)
  3. #define RGB555_MASK_RED 0x7C00 // 0111110000000000
  4. #define RGB555_MASK_GREEN 0x03E0 // 0000001111100000
  5. #define RGB555_MASK_BLUE 0x001F // 0000000000011111
  6. R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
  7. G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
  8. B = (wPixel & RGB555_MASK_BLUE); // 取值范围0-31

RGB565

16位RGB格式,R分量(5bit)、G分量(6bit)、B分量(5bit),总共可以表示2(约6.5万)种颜色。在程序中一般也是通过一个WORD来操作一个像素。具体如下:

  1. // |高字节 低字节|
  2. // R R R R R G G G G G G B B B B B
  3. #define RGB565_MASK_RED 0xF800 // 1111100000000000
  4. #define RGB565_MASK_GREEN 0x07E0 // 0000011111100000
  5. #define RGB565_MASK_BLUE 0x001F // 0000000000011111
  6. R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
  7. G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
  8. B = (wPixel & RGB565_MASK_GREEN); // 取值范围0-31
  9. // 24 bit RGB 与 16 bit RGB 互相转换。
  10. #define RGB(r,g,b) (unsigned int)( (r|0x08 << 11) | (g|0x08 << 6) | b|0x08 )
  11. #define RGB(r,g,b) (unsigned int)( (r|0x08 << 10) | (g|0x08 << 5) | b|0x08 )

RGB24(RGB888)

24位RGB格式,R(8bit)、G(8bit)、B分量(8bit),总共可以表示约1600万种颜色,也叫千万色、24位色。在程序中一般这样操作:

  1. // 注意,在内存中RGB各分量的排列顺序是:BGR BGR BGR ...
  2. typedef struct tagRGBTRIPLE{
  3. BYTE rgbBlue; // B分量
  4. BYTE rgbGreen; // G分量
  5. BYTE rgbRed; // R分量
  6. } RGBTRIPLE;

RGB32(RGBA8888)

用32位来表示一个像素,RGB分量各占8bit,剩下8bit用作alpha通道或者不用。在程序中一般这样操作:

  1. typedef struct tagRGBQUAD{
  2. BYTE rgbBlue; // B分量
  3. BYTE rgbGreen; // G分量
  4. BYTE rgbRed; // R分量
  5. BYTE rgbReserved; // 保留字节(用作alpha通道或者不用)
  6. } RGBQUAD;