1揽惹,YUV420P
若視頻幀的寬和高分別為w和h
1盔沫,一幀YUV420P像素?cái)?shù)據(jù)一共占用w*h*3/2 Byte的數(shù)據(jù);
2构舟,其中前w*h Byte存儲Y灰追;
3,接著的w*h*1/4 Byte存儲U狗超;
4弹澎,最后w*h*1/4 Byte存儲V。
eg:
先有一張分辨率為256x256圖片努咐,其中:
1裁奇,純Y數(shù)據(jù),分辨率為256x256麦撵;
2,純U數(shù)據(jù)溃肪,分辨率為128x128免胃;
3,純V數(shù)據(jù)惫撰,分辨率為128x128羔沙;
如果想把YUV格式像素?cái)?shù)據(jù)變成灰度圖像,只需要將U厨钻、V分量設(shè)置成128即可扼雏。
這是因?yàn)閁、V是圖像中的經(jīng)過偏置處理的色度分量夯膀。色度分量在偏置處理前的取值范圍是-128至127诗充,這時(shí)候的無色對應(yīng)的是“0”值。經(jīng)過偏置后色度分量取值變成了0至255诱建,因而此時(shí)的無色對應(yīng)的就是128了蝴蜓。
2,YUV444P
若視頻幀的寬和高分別為w和h
1,一幀YUV444P像素?cái)?shù)據(jù)一共占用w*h*3 Byte的數(shù)據(jù)茎匠;
2格仲,前w*h Byte存儲Y;
3诵冒,接著的w*h Byte存儲U凯肋;
4,最后w*h Byte存儲V汽馋;
eg:
先有一張分辨率為256x256圖片侮东,其中
1,Y,U,V各數(shù)據(jù),分辨率為256x256
3惭蟋,BMP格式:BMP采用的是小端(Little Endian)存儲方式苗桂。這種存儲方式中“RGB24”格式的像素的分量存儲的先后順序?yàn)锽、G告组、R煤伟。由于RGB24格式存儲的順序是R、G木缝、B便锨,所以需要將“R”和“B”順序作一個(gè)調(diào)換再進(jìn)行存儲。
BMP組成 |
---|---
BITMAPFILEHEADER |
BITMAPINFOHEADER |
RGB像素?cái)?shù)據(jù) |
typedef struct tagBITMAPFILEHEADER
{
unsigned short int bfType; //位圖文件的類型我碟,必須為BM
unsigned long bfSize; //文件大小放案,以字節(jié)為單位
unsigned short int bfReserverd1; //位圖文件保留字,必須為0
unsigned short int bfReserverd2; //位圖文件保留字矫俺,必須為0
unsigned long bfbfOffBits; //位圖文件頭到數(shù)據(jù)的偏移量吱殉,以字節(jié)為單位
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
long biSize; //該結(jié)構(gòu)大小,字節(jié)為單位
long biWidth; //圖形寬度以象素為單位
long biHeight; //圖形高度以象素為單位
short int biPlanes; //目標(biāo)設(shè)備的級別厘托,必須為1
short int biBitcount; //顏色深度友雳,每個(gè)象素所需要的位數(shù)
short int biCompression; //位圖的壓縮類型
long biSizeImage; //位圖的大小,以字節(jié)為單位
long biXPelsPermeter; //位圖水平分辨率铅匹,每米像素?cái)?shù)
long biYPelsPermeter; //位圖垂直分辨率押赊,每米像素?cái)?shù)
long biClrUsed; //位圖實(shí)際使用的顏色表中的顏色數(shù)
long biClrImportant; //位圖顯示過程中重要的顏色數(shù)
}BITMAPINFOHEADER;
4,RGB轉(zhuǎn)YUV
Y= 0.299*R+0.587*G+0.114*B
U=-0.147*R-0.289*G+0.463*B
V= 0.615*R-0.515*G-0.100*B
**注意公式的由來,參考前兩節(jié)
在轉(zhuǎn)換的過程中有以下幾點(diǎn)需要注意:
1) RGB24存儲方式是Packed包斑,YUV420P存儲方式是Packed流礁。
2) U,V在水平和垂直方向的取樣數(shù)是Y的一半罗丰。