常見RAW顏色格式
RGB 類型:
ARGB1010102,ABGR1010102,BGRA1010102,RGBA1010102
ARGB8888,ABGR8888,BGRA8888,RGBA8888
XRGB8888,XBGR8888,BGRX8888,RGBX8888
RGB888,BGR888
RGB565,BGR565YUV 類型:
8-bit YUV 4:2:2 2-plane
8-bit YUV 4:2:2 1-plane(VYUY,YVYU)
8-bit YUV 4:2:0(2-plane)
8-bit YUV 4:2:0(3-plane)
RGB類型
RGB顏色空間以R(Red:紅)、G(Green:綠)、B(Blue:藍)三種基本色為基礎(chǔ),進行不同程度的疊加,產(chǎn)生豐富而廣泛的顏色,所以俗稱三基色模式
不同的顏色格式表示的是各個分量占用的BIT數(shù),比如RGBA888 表示Red、Green、Blue、Alpha 通道各占8BIT,每個像素占32BIT(4字節(jié))
YUV類型
YUV是一種顏色編碼方法,是編譯true-color顏色空間(color space)的種類,常使用在各個視頻處理組件中; YUV在對照片或視頻編碼時,考慮到人類的感知能力,允許降低色度的帶寬。其中的"Y"表示明亮度,也就是灰階值,即黑到白的范圍值,所以只有Y值的圖像是黑白的,U表示色彩值,V表示色彩的飽和度,UV用于指定像素的顏色
YUV類型介紹
YUV格式按照存儲方法可以分為下面兩類:
平面格式 (planar formats)
將Y、U、V的三個分量分別存放在不同的存儲空間中,先連續(xù)存儲所有像素點的Y,緊接著存儲所有像素點的U,隨后是所有像素點的V緊縮格式 (packed formats)
將Y、U、V值按照像素存儲在相同的存儲空間,和RGB的存放方式類似,每個像素點的Y,U,V是連續(xù)交替存儲的
按照采樣方式的不同,分為下面幾種類型
YUV4:4:4 表示完全取樣。
YUV4:2:2 表示2:1的水平取樣,垂直完全采樣。
YUV4:2:0 表示2:1的水平取樣,垂直2:1采樣。
YUV444類型
每個像素點都存儲對應(yīng)的YUV值,注意444不是代表每個分量的字節(jié)數(shù);YUV每個分量都需要占用一個字節(jié)(8bit)
所以,在1080x1920的圖像中,需要1080x1920x(1Y + 1U + 1V)(字節(jié))來存儲
YUV 444 格式在屏幕上分布如下圖所示:

YUV422類型
每兩個相鄰像素點共用一對UV值,所以在1080x1920的圖像中,需要1080x1920x(1Y+ 0.5U + 0.5V)(字節(jié))來存儲
YUV422格式在屏幕上分布如下圖所示:

YUV422 存儲格式:
-
YUYV packed
YUYV.png -
YVYU packed
YVYU.png -
YU16、I422
YU16.png -
YV16
YV16.png
YUV420類型
每四個相鄰像素點共用一對UV值,相當于每個Y只占用0.25U和0.25V,在1080x1920的圖像中,需要1080x1920x(1Y+ 0.25U + 0.25V)(字節(jié))來存儲。
YUV422格式在屏幕上分布如下圖所示:

YU12(I420)、YV12

NV12 NV21

各個類型之間的轉(zhuǎn)換
Android 的soure code 中提供了 libyuv 庫來實現(xiàn)各個顏色類型之間的轉(zhuǎn)換,代碼是在 external下的 libyuv 目錄下:
external/libyuv/files/include/libyuv/convert.h
external/libyuv/files/source/convert.cc
LIBYUV_API
int NV12ToI420(const uint8* src_y,
int src_stride_y,
const uint8* src_uv,
int src_stride_uv,
uint8* dst_y,
int dst_stride_y,
uint8* dst_u,
int dst_stride_u,
uint8* dst_v,
int dst_stride_v,
int width,
int height);
// Convert NV21 to I420.
LIBYUV_API
int NV21ToI420(const uint8* src_y,
int src_stride_y,
const uint8* src_vu,
int src_stride_vu,
uint8* dst_y,
int dst_stride_y,
uint8* dst_u,
int dst_stride_u,
uint8* dst_v,
int dst_stride_v,
int width,
int height);
......



