RGB的幾種格式和描述
RGB565 每個像素用16位表示,RGB分量分别使用5位、6位、5位
RGB555 每個像素用16位表示,RGB分量都使用5位(剩下1位不用)
RGB24 每個像素用24位表示,RGB分量各使用8位
RGB32 每個像素用32位表示,RGB分量各使用8位(剩下8位不用)
ARGB32 每個像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)
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
可以組合使用屏蔽字和移位操作來得到RGB各分量的值:
#define RGB565_MASK_RED 0xF800
#define RGB565_MASK_GREEN 0x07E0
#define RGB565_MASK_BLUE 0x001F
R = (wPixel & RGB565_MASK_RED) >> 11; // 取值範圍0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值範圍0-63
B = wPixel & RGB565_MASK_BLUE; // 取值範圍0-31
#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 )
該代碼可以解決24位與16位互相轉換的問題
RGB555
是另一種16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。
使用一個字讀出一個像素後,這個字的各個位意義如下:
高位元組 低位元組
X R R R R G G G G G B B B B B (X表示不用,可以忽略)
RGB24使用24位來表示一個像素,RGB分量都用8位表示,取值範圍為0-255
RGB32使用32位來表示一個像素,RGB分量各用去8位,剩下的8位不用
RGB24
RGB24使用24位來表示一個像素,RGB分量都用8位表示,取值範圍為0-255。注意在記憶體中RGB各分量的排列順序為:BGR BGR BGR…。通常可以使用RGBTRIPLE資料結構來操作一個像素,它的定義為:
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue; // 藍色分量
BYTE rgbtGreen; // 綠色分量
BYTE rgbtRed; // 紅色分量
} RGBTRIPLE;
RGB32
RGB32使用32位來表示一個像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是帶Alpha通道的RGB24。)注意在記憶體中RGB各分量的排列順序為:BGRA BGRA BGRA…。通常可以使用RGBQUAD資料結構來操作一個像素,它的定義為:
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 藍色分量
BYTE rgbGreen; // 綠色分量
BYTE rgbRed; // 紅色分量
BYTE rgbReserved; // 保留位元組(用作Alpha通道或忽略)
} RGBQUAD。