天天看點

RGB格式解析

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。