http://blog.csdn.net/ooakk/article/details/7261961
1.灰階圖Gray Scale Image 定義
Gray Scale Image 或是 Gray Scale Image,56階。又稱灰階圖。把白色與黑色之間按對數關係分為若干等級,稱為灰階。灰階分為2用灰階表示的映像稱作灰階圖。
什麼叫灰階圖?任何顏色都有紅、綠、藍三原色組成,假如原來某點的顏色為RGB(R,G,B),那麼,我們可以通過下面幾種方法,將其轉換為灰階:
1.浮點演算法:Gray=R*0.3+G*0.59+B*0.11
2.整數方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.僅取綠色:Gray=G;
通過上述任一種方法求得Gray後,將原來的RGB(R,G,B)中的R,G,B統一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰階圖了。
在嵌入式系統中採用灰階圖顯示可以顯著降低顯示RAM容量的要求。
參考連結:
(1)http://baike.baidu.com/view/1184366.htm
(2) http://en.wikipedia.org/wiki/Grayscale
【附】RGB映像的各種格式
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各分量的值:
[cpp]
view plaincopyprint?
- #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 )
#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表示不用,可以忽略)
可以組合使用屏蔽字和移位操作來得到RGB各分量的值:
[cpp]
view plaincopyprint?
- #define RGB555_MASK_RED 0x7C00
- #define RGB555_MASK_GREEN 0x03E0
- #define RGB555_MASK_BLUE 0x001F
- R = (wPixel & RGB555_MASK_RED) >> 10; // 取值範圍0-31
- G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值範圍0-31
- B = wPixel & RGB555_MASK_BLUE; // 取值範圍0-31
#define RGB555_MASK_RED 0x7C00 #define RGB555_MASK_GREEN 0x03E0 #define RGB555_MASK_BLUE 0x001F R = (wPixel & RGB555_MASK_RED) >> 10; // 取值範圍0-31 G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值範圍0-31 B = wPixel & RGB555_MASK_BLUE; // 取值範圍0-31
RGB24使用24位來表示一個像素,RGB分量都用8位表示,取值範圍為0-255。注意在記憶體中RGB各分量的排列順序為:BGR BGR BGR…。通常可以使用RGBTRIPLE資料結構來操作一個像素,它的定義為:
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue; // 藍色分量
BYTE rgbtGreen; // 綠色分量
BYTE rgbtRed; // 紅色分量
} RGBTRIPLE;
參考:網路資料。
1.灰階圖Gray Scale Image 定義
Gray Scale Image 或是 Gray Scale Image,56階。又稱灰階圖。把白色與黑色之間按對數關係分為若干等級,稱為灰階。灰階分為2用灰階表示的映像稱作灰階圖。
什麼叫灰階圖?任何顏色都有紅、綠、藍三原色組成,假如原來某點的顏色為RGB(R,G,B),那麼,我們可以通過下面幾種方法,將其轉換為灰階:
1.浮點演算法:Gray=R*0.3+G*0.59+B*0.11
2.整數方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.僅取綠色:Gray=G;
通過上述任一種方法求得Gray後,將原來的RGB(R,G,B)中的R,G,B統一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰階圖了。
在嵌入式系統中採用灰階圖顯示可以顯著降低顯示RAM容量的要求。
參考連結:
(1)http://baike.baidu.com/view/1184366.htm
(2) http://en.wikipedia.org/wiki/Grayscale
【附】RGB映像的各種格式
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各分量的值:
[cpp]
view plaincopyprint?
- #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 )
#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表示不用,可以忽略)
可以組合使用屏蔽字和移位操作來得到RGB各分量的值:
[cpp]
view plaincopyprint?
- #define RGB555_MASK_RED 0x7C00
- #define RGB555_MASK_GREEN 0x03E0
- #define RGB555_MASK_BLUE 0x001F
- R = (wPixel & RGB555_MASK_RED) >> 10; // 取值範圍0-31
- G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值範圍0-31
- B = wPixel & RGB555_MASK_BLUE; // 取值範圍0-31
#define RGB555_MASK_RED 0x7C00 #define RGB555_MASK_GREEN 0x03E0 #define RGB555_MASK_BLUE 0x001F R = (wPixel & RGB555_MASK_RED) >> 10; // 取值範圍0-31 G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值範圍0-31 B = wPixel & RGB555_MASK_BLUE; // 取值範圍0-31
RGB24使用24位來表示一個像素,RGB分量都用8位表示,取值範圍為0-255。注意在記憶體中RGB各分量的排列順序為:BGR BGR BGR…。通常可以使用RGBTRIPLE資料結構來操作一個像素,它的定義為:
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue; // 藍色分量
BYTE rgbtGreen; // 綠色分量
BYTE rgbtRed; // 紅色分量
} RGBTRIPLE;
參考:網路資料。