前言RGB565RGB24ARGB_8888I420 和 NV21灰階值是什麼?既然都是YUV420格式的,I420 和 NV21 到底有何區別?總結參考資料git
此篇文章針對
Android
中圖像處理工具 ImageUtils 的解釋篇,有興趣的童鞋能夠 點擊此處 瞭解這款開源工具。github
針對圖像,存在各類各樣的格式,每一個格式都不同,而在Android中,經常使用的圖像格式無外乎也就幾種,下面就Android中經常使用的圖像格式作相關說明。web
Android中自帶的一種圖像格式,這個圖像格式像素排布以下圖:算法
RGB565
每一個像素點都有紅、綠、藍三個原色,其中 R
原色佔用 5 bit
,G
原色佔用 6 bit
,B
原色佔用 5 bit
,也就是說一個像素點總佔用 5 + 6 + 5 = 16 bit
。windows
一張 640 * 480
分辨率的 RGB565
圖像,其佔用的內存大小爲:640 * 480 * 16 / 8 = 614400 byte
app
一般在處理一個圖像數據時會涉及到步長,步長計算通常爲下面的公式:ide
步長 = 圖像的寬 * 每一個像素點總 bit 數 / 8工具
所以,對於 640 * 480
的 RGB565
圖像而言,其步長爲:640 * 16 / 8 = 1280
post
如上圖,RGB24
其真正的排序是 BGR BGR ...
這種排序的,而並不是 RGB RGB ...
這種排序。編碼
一樣的,RGB24
每一個像素點都有藍、紅、綠三個原色 B
、G
、R
三個原色各佔用 8 bit
,也就是說一個像素點總佔用 24 bit
。
一張 640 * 480
分辨率的 RGB24
圖像,其佔用的內存大小爲:640 * 480 * 24 / 8 = 921600 byte
。
一樣的,對於 640 * 480
的 RGB24
圖像而言,其步長爲:640 * 24 / 8 = 1920
如上圖,ARGB_8888
做爲在Android中咱們最經常使用的一種圖像格式,其實其真正的圖像格式爲 RGBA
。
ARGB_8888
除了包含 R
、G
、B
經常使用的三原色之外,還包含一個透明度 Alpha
,並且一個像素點中的每一個通道各佔 8 bit
,一個像素點總計: 8 * 4 = 32 bit
。
也就是說,對於一張 640 * 480
分辨率的 ARGB_8888
圖像,其佔用的內存大小爲:640 * 480 * 32 / 8 = 1228800 byte
。
而其對應的步長爲:640 * 32 / 8 = 2560
I420
和 NV21
都是屬於 YUV
格式的數據。
所謂的 YUV
格式指的是圖像的顏色編碼採用的是 明亮度 和 色度來指定像素的顏色,而不是一般使用的三原色來指定。
例以下圖:
上圖是一個 YUV444
的圖像格式。
Y
表明明亮度,也即灰階值UV
表明色度,是描述影像色彩及飽和度,用於指定像素的顏色YUV
與 RGB
是如何互相轉換的,您能夠 參見這裏當
R = B = G
時候,像素點的顏色就呈現黑白色調,這種像素點拼接起來的圖像呈現爲灰度圖,R = B = G
的通道值就是灰階。
一般狀況下彩色像素點轉灰階值通常採用大體於R:G:B=3:6:1
的算法計算灰階值,實際上RGB
轉換成YUV
時,Y
份量的計算公式爲:Y = 0.299 * R + 0.587 * G + 0.114 * B
複製代碼
其R
、G
、B
比例基本與3 : 6 : 1
吻合【具體的可 點擊參考此處 】。
繼續說回 YUV,針對 YUV444
這種格式,其採樣比例爲 Y
: U
: V
= 4 : 4 : 4
,也即 1 : 1 : 1
。
例如上圖,其採樣流是這樣的:
Y1
U1
V1
Y2
U2
V2
Y3
U3
V3
Y4
U4
V4
Y5
U5
V5
...
也就是說採樣時候每一個像素的 Y
U
V
三個份量都是完整的,而在一個像素點中,一個完整的份量佔用 8 bit
大小,
所以針對一個 640 * 480
大小的 YUV444
的圖像,其真實的佔用大小爲:
640 * 480 * 8 * 3 = 921600 bit
跟 RGB24
佔用的大小是一致的;一樣的針對 YUV444
,其圖像的步長同樣跟 RGB24
同樣,爲 640 * 3 = 1920
。
針對這種徹底採樣的 YUV
格式,並無給圖像進行壓縮,所以業界也不多使用 YUV444
這種格式對圖像進程存儲。
實際上,目前使用最多的 YUV
圖像採集格式主要包含 YUV422
和 YUV420
這兩種採集方式,而 I420
和 NV21
剛好是這種數據採集方式,YUV420
數據採集大概是下面這種方式:
針對 YUV420
這種採用方式,有如下幾個特色:
Y
份量必須採集U
或 V
】,並且採樣比例爲 Y
: U【V】
= 2
: 1
如上圖,你會發現,每一個像素本來均包含 Y
U
V
三個份量,而在進行 YUV420
採樣的時候,每一個 Y
份量都進行了採集,而 U
和 V
份量並不是每一行都採集,而是先採集一行 U
份量在採集一行 V
份量,並且是每隔一個像素點採集一次的。上圖第一行 對 Y
份量都採集了,而 U
份量只採集了 Y
份量的一半,V
份量沒有采集;到第二行,Y
份量仍是所有采集,此時 V
份量採集了,採集的數量是 Y
份量的一半,U
份量未採集。
也就是說其採樣流是這樣的:
Y1
U1
Y2
Y3
U3
Y4
Y5
V5
Y6
Y7
V7
Y8
Y9
U9
Y10
Y11
U11
Y12
Y13
V13
Y14
Y15
V15
Y16
同時映射成的像素點如上圖藍色虛線框中的方式進行映射,也即下面這種:
[Y1 U1 V5]
[Y2 U1 V5]
[Y3 U3 V7]
[Y4 U3 V7]
[Y5 U1 V5]
[Y6 U1 V5]
[Y7 U3 V7]
[Y8 U3 V7]
[Y9 U9 V13]
[Y10 U9 V13]
[Y11 U11 V15]
[Y12 U11 V15]
[Y13 U9 V13]
[Y14 U9 V13]
[Y15 U11 V15]
[Y16 U11 V15]
針對 YUV420
這種採樣的圖像,你會發現這種方式對圖片作了必定的壓縮,咱們能夠根據上面的方式計算,
對於一個 640 * 480
大小的圖像,其佔用的內存爲:Y
份量:640 * 480 * 8 = 2457600 bit
U
和 V
份量總佔用爲 :640 * 480 * 0.5 * 8 = 1228800 bit
所以總佔用內存大小爲:640 * 480 * 8 + 640 * 480 * 0.5 * 8 = 3686400 bit = 460800 byte
同時能夠計算出對於的 YUV420
格式的大小爲 640 * 480
圖像的步長爲:640 + 0.5 * 640 = 960
針對基於 YUV 4:2:0
採樣的格式,主要分爲兩種類型:
YUV420P
YUV420SP
也就是說 I420
是屬於 YUV420P
這種類型的,這種類型的格式存儲有如下特色:
Planar
模式【平面模式】進行存儲的Y
份量,而後在存儲 U
或 V
份量U
份量,再存儲的是 V
份量,則這種格式即 YU12
格式,即咱們所說的 I420
格式 V
份量,再存儲的是 U
份量,則這種格式即 YV12
格式 以下圖,即爲 一個分辨率爲 8 * 4
的I420
圖像的存儲格式圖:
咱們能夠把這種存儲方式理解成三層,其中第一層固定存儲 Y
份量,第二和第三層根據實際格式分別存儲 U
和 V
(或 V
和 U
)
一樣的,對應的 NV21
圖像格式,它是屬於 YUV420SP
這種類型的,此類型的存儲格式有如下特色:
Planar
模式【平面模式】進行存儲的,而嚴格上來講,是屬於 biplanar
模式【雙平面模式】Y
份量,而後再將 U
V
兩個份量交替連續存儲U
和 V
的循序交替存儲時,則爲 NV12
格式V
和 U
的循序交替存儲時,則爲 NV21
格式下圖爲一個分辨率爲 8 * 4
的 NV21
格式圖像存儲圖:
至此,關於 I420
和 NV21
這兩種圖像格式就介紹完了,有關更多的關於 YUV
的其餘格式,可點擊 此處 進行了解。