圖解RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32等格式的區別


概述

RGB色彩模式是工業界的一種顏色標准,是通過對紅、綠、藍三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。

RGB16格式

RGB16數據格式主要有二種:RGB565RGB555

  • 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分量圖像


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM