一、RGB格式圖片原理
前面講了一幀YUV影像是由Y(亮度)U(色度)V(色度)來表示的,而RGB影像是由R(紅色)G(綠色)B(藍色)三個分量來表示的,
二、RGB格式圖片資料的內部排列
RGB格式的圖片,比較常見的有如下三種:
1.RGB16(16位)
顧名思義,RGB16是以16位(2個位元組)為一個存盤單元,來存盤一個RGB像素,RGB16又有以下兩種比較常見的存盤形式
1.1 RGB565
這里每個像素點用16位(2個位元組)來表示,R、G、B分量分別占用了5位、6位、5位,內部排列如下所示
高位元組 低位元組
R R R R R G G G G G G B B B B B
2.2 RGB555
這里每個像素點依舊用16位(2個位元組)來表示,最高位不使用,R、G、B分量分別占用了5位,5位,5位,內部排列如下所示
高位元組 低位元組
空 R R R R R G G G G G B B B B B
2.RGB24(24位)
RGB24是將24位的資料,分成3份,分別去存盤R、G、B分量,所以每個分量占的大小應是8位(1個位元組),這里需要注意的是:R、G、B分量存盤的順序,從高位元組到低位元組,必須是以B G R的順序來存盤,為什么這里要強調從高位元組到低位元組,因為后續如果進行圖片格式轉換,遇到位元組序不一致,需要對應地進行轉換,內部排列如下所示
高位元組 低位元組
B B B B B B B B G G G G G G G G R R R R R R R R
3.RGB32(32位)
RGB32中,每個像素點用32位(4個位元組)來表示,這里存盤的順序和RGB24一樣,這里不再過多贅述,唯一不同的是,在低位元組處保留了8位,內部排列如下所示
高位元組
B B B B B B B B G G G G G G G G
低位元組
R R R R R R R R N N N N N N N N(N就是空的意思,hhh)
三、編程分離R G B分量
下面我們來編程分離一張RGB24格式圖片中的R,G,B分量
#include <stdio.h>
#include <stdlib.h>
/*
para: fileName 輸入檔案名
width 寬
height 高
*/
int rgb24Split(char *fileName, int width, int height)
{
FILE *fp = fopen(fileName, "rb+");
FILE *fp1 = fopen("output_r.y", "wb+");
FILE *fp2 = fopen("output_g.y", "wb+");
FILE *fp3 = fopen("output_b.y", "wb+");
unsigned char *buffer = (unsigned char *)malloc(width * height * 3);
fread(buffer, 1, width * height * 3, fp);
for (int i = 0; i < width * height * 3; i = i + 3)
{
//R
fwrite(buffer + i, 1, 1, fp1);
//G
fwrite(buffer + i + 1, 1, 1, fp2);
//B
fwrite(buffer + i + 2, 1, 1, fp3);
}
free(buffer);
fclose(fp);
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
/* a test file to split r g b */
int main()
{
rgb24Split("cie1931_500x500.rgb", 500, 500);
return 0;
}
首先我們打開原圖片

我們這里分離了R,G,B三原色,可能看到這里有的同學要問,為什么不是以B,G,R的順序寫入,因為先前說過位元組序的問題,所以這里應該是以R,G,B的順序寫入,
我們把每個資料都單獨存盤到檔案中,所以不能算是一幀RGB影像了,所以我們以“Y(只看亮度)”的格式去打開這些檔案,查看某種顏色的強度,
由觀察得知,這張圖片左上角綠色的強度偏大,右邊的紅色強度偏大,左下角則是藍色的強度偏大,
下面看一下我們分離出的圖片
分離出的R資料影像

分離出的G資料影像

分離出的B資料影像

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259028.html
標籤:其他
