圖形圖像基礎(chǔ)知識(1)---- RGB/YUV 顏色格式

常見RAW顏色格式

  • RGB 類型:
    ARGB1010102,ABGR1010102,BGRA1010102,RGBA1010102
    ARGB8888,ABGR8888,BGRA8888,RGBA8888
    XRGB8888,XBGR8888,BGRX8888,RGBX8888
    RGB888,BGR888
    RGB565,BGR565

  • YUV 類型:
    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 格式在屏幕上分布如下圖所示:


YUV444.png
YUV422類型

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


YUV422.png

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格式在屏幕上分布如下圖所示:


YUV420.jpg

YU12(I420)、YV12

YU12-YV12.png

NV12 NV21

NV12-NV21.png

各個類型之間的轉(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);
......
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容