概述
RGB色彩模式
是工業界的一種顏色標准,是通過對紅、綠、藍三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。
RGB16格式
RGB16
數據格式主要有二種:RGB565
和RGB555
。
- RGB565
每個像素用16比特位表示,占2個字節,RGB分量分別使用5位、6位、5位。
1 //獲取高字節的5個bit
2 R = color & 0xF800; 3 //獲取中間6個bit
4 G = color & 0x07E0; 5 //獲取低字節5個bit
6 B = color & 0x001F;
- RGB555
每個像素用16比特位表示,占2個字節,RGB分量都使用5位(最高位不用)。
1 //獲取高字節的5個bit
2 R = color & 0x7C00; 3 //獲取中間5個bit
4 G = color & 0x03E0; 5 //獲取低字節5個bit
6 B = color & 0x001F;
RGB24格式
RGB24圖像
每個像素用8比特位
表示,占1個字節
,注意:在內存中RGB各分量的排列順序為:BGR BGR BGR ......
。
RGB32格式
RGB32圖像
每個像素用32比特位
表示,占4個字節
,R,G,B
分量分別用8個bit表示,存儲順序為B,G,R
,最后8個字節
保留。注意:在內存中RGB各分量的排列順序為:BGRA BGRA BGRA ......
。
- ARGB32
本質就是帶
alpha通道
的RGB24
,與RGB32
的區別在與,保留的8個bit
用來表示透明,也就是alpha
的值。
在內存中的分量排列順序如下:
1 R = color & 0x0000FF00; 2 G = color & 0x00FF0000; 3 B = color & 0xFF000000; 4 A = color & 0x000000FF;
android平台下的RGB格式
我們平時在android平台下
處理Bitmap
的時候,下面的幾個參數應該接觸的比較多:
- Bitmap.Config.ALPHA_8:
每個像素用8比特位表示,占1個字節,只有透明度,沒有顏色。
- Bitmap.Config.RGB_565:
每個像素用16比特位表示,占2個字節,RGB分量分別使用5位、6位、5位,上面的圖已經有作說明。
- Bitmap.Config.ARGB_4444:
每個像素用16比特位表示,占2個字節,由4個4位組成,ARGB分量都是4位。
- Bitmap.Config.ARGB_8888:
每個像素用32比特位表示,占4個字節,由4個8位組成,ARGB分量都是8位。
注意:java默認使用大端字節序,c/c++默認使用小端字節序
,android
平台下Bitmap.config.ARGB_8888
的Bitmap默認是大端字節序
,當需要把這個圖片內存數據給小端語言
使用的時候,就需要把大端字節序
轉換為小端字節序
。例如:java層
的ARGB_8888
傳遞給jni層
使用時,需要把java層的ARGB_8888
的內存數據轉換為BGRA8888
。
分離RGB24像素數據中的R、G、B分量
先准備一張色彩圖:
使用ffmpeg命令
將其轉換成rgb格式
ffmpeg -i 375x375.jpeg -s 375x375 -pix_fmt rgb24 rgb24.rgb
1 void split_rgb24(char *inputPath, int width, int height) { 2 FILE *fp_rgb = fopen(inputPath, "rb+"); 3 FILE *fp_r = fopen("output_r", "wb+"); 4 FILE *fp_g = fopen("output_g", "wb+"); 5 FILE *fp_b = fopen("output_b", "wb+"); 6
7 unsigned char *data = (unsigned char *) malloc(width * height * 3); 8
9 fread(data, 1, width * height * 3, fp_rgb); 10 int index = 0; 11 for (index = 0; index < width * height * 3; index = index + 3) { 12 //R
13 fwrite(data + index, 1, 1, fp_r); 14 //G
15 fwrite(data + index + 1, 1, 1, fp_g); 16 //B
17 fwrite(data + index + 2, 1, 1, fp_b); 18 } 19
20 cout << index << endl; 21
22 free(data); 23 fclose(fp_rgb); 24 fclose(fp_r); 25 fclose(fp_g); 26 fclose(fp_b); 27 }
1 int main() { 2
3 split_rgb24("/home/byhook/media/rgb24.rgb", 375, 375); 4
5 return 0; 6 }
最終我們可以通過雷神提供的工具,來查看分離的R,G,B三個分量的文件
:
- R分量圖像
- G分量圖像
- B分量圖像