参考资料
- https://baike.baidu.com/item/RGB/342517?fr=aladdin
- https://www.cnblogs.com/justkong/p/6570914.html
- https://blog.csdn.net/leansmall/article/details/84262091
- https://www.cnblogs.com/yunlambert/p/11234971.html
- https://blog.csdn.net/tainjau/article/details/80220134
- https://baike.baidu.com/item/%E9%A2%9C%E8%89%B2%E6%A8%A1%E5%9E%8B/7558583?fr=aladdin
颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光。
说人话,用数字来表示颜色,让计算机“理解”颜色,常见的颜色模型有:
- 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:
根据每个色值分量的比例不同可以分为以下几种类型:
RGB555
16位RGB格式,用16bit来表示一个像素,每个分量都是5bit大小,剩下1bit不用。总共可以表示2(约3万)种颜色。
在程序中通常使用一个字(WORD)来操作,一般一个WORD是2个字节大小,具体如下:
// |高字节 低字节|
// X R R R R R G G G G G B B B B B (X表示不用,可以忽略)
#define RGB555_MASK_RED 0x7C00 // 0111110000000000
#define RGB555_MASK_GREEN 0x03E0 // 0000001111100000
#define RGB555_MASK_BLUE 0x001F // 0000000000011111
R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
B = (wPixel & RGB555_MASK_BLUE); // 取值范围0-31
RGB565
16位RGB格式,R分量(5bit)、G分量(6bit)、B分量(5bit),总共可以表示2(约6.5万)种颜色。在程序中一般也是通过一个WORD来操作一个像素。具体如下:
// |高字节 低字节|
// R R R R R G G G G G G B B B B B
#define RGB565_MASK_RED 0xF800 // 1111100000000000
#define RGB565_MASK_GREEN 0x07E0 // 0000011111100000
#define RGB565_MASK_BLUE 0x001F // 0000000000011111
R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
B = (wPixel & RGB565_MASK_GREEN); // 取值范围0-31
// 24 bit RGB 与 16 bit RGB 互相转换。
#define RGB(r,g,b) (unsigned int)( (r|0x08 << 11) | (g|0x08 << 6) | b|0x08 )
#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位色。在程序中一般这样操作:
// 注意,在内存中RGB各分量的排列顺序是:BGR BGR BGR ...
typedef struct tagRGBTRIPLE{
BYTE rgbBlue; // B分量
BYTE rgbGreen; // G分量
BYTE rgbRed; // R分量
} RGBTRIPLE;
RGB32(RGBA8888)
用32位来表示一个像素,RGB分量各占8bit,剩下8bit用作alpha通道或者不用。在程序中一般这样操作:
typedef struct tagRGBQUAD{
BYTE rgbBlue; // B分量
BYTE rgbGreen; // G分量
BYTE rgbRed; // R分量
BYTE rgbReserved; // 保留字节(用作alpha通道或者不用)
} RGBQUAD;