Android中經常使用圖像格式說明

前言RGB565RGB24ARGB_8888I420 和 NV21灰階值是什麼?既然都是YUV420格式的,I420 和 NV21 到底有何區別?總結參考資料git

前言

此篇文章針對 Android 中圖像處理工具 ImageUtils 的解釋篇,有興趣的童鞋能夠 點擊此處 瞭解這款開源工具。github

針對圖像,存在各類各樣的格式,每一個格式都不同,而在Android中,經常使用的圖像格式無外乎也就幾種,下面就Android中經常使用的圖像格式作相關說明。web

RGB565

Android中自帶的一種圖像格式,這個圖像格式像素排布以下圖:算法

image
image

RGB565 每一個像素點都有紅、綠、藍三個原色,其中 R 原色佔用 5 bitG 原色佔用 6 bitB 原色佔用 5 bit,也就是說一個像素點總佔用 5 + 6 + 5 = 16 bitwindows

一張 640 * 480 分辨率的 RGB565 圖像,其佔用的內存大小爲:640 * 480 * 16 / 8 = 614400 byteapp

一般在處理一個圖像數據時會涉及到步長,步長計算通常爲下面的公式:ide

步長 = 圖像的寬 * 每一個像素點總 bit 數 / 8工具

所以,對於 640 * 480RGB565 圖像而言,其步長爲:640 * 16 / 8 = 1280post


RGB24

image
image

如上圖,RGB24 其真正的排序是 BGR BGR ... 這種排序的,而並不是 RGB RGB ... 這種排序。編碼

一樣的,RGB24 每一個像素點都有藍、紅、綠三個原色 BGR 三個原色各佔用 8 bit,也就是說一個像素點總佔用 24 bit

一張 640 * 480 分辨率的 RGB24 圖像,其佔用的內存大小爲:640 * 480 * 24 / 8 = 921600 byte

一樣的,對於 640 * 480RGB24 圖像而言,其步長爲:640 * 24 / 8 = 1920


ARGB_8888

image
image

如上圖,ARGB_8888 做爲在Android中咱們最經常使用的一種圖像格式,其實其真正的圖像格式爲 RGBA

ARGB_8888 除了包含 RGB 經常使用的三原色之外,還包含一個透明度 Alpha,並且一個像素點中的每一個通道各佔 8 bit,一個像素點總計: 8 * 4 = 32 bit

也就是說,對於一張 640 * 480 分辨率的 ARGB_8888 圖像,其佔用的內存大小爲:640 * 480 * 32 / 8 = 1228800 byte
而其對應的步長爲:640 * 32 / 8 = 2560


I420 和 NV21

I420NV21 都是屬於 YUV 格式的數據。

所謂的 YUV 格式指的是圖像的顏色編碼採用的是 明亮度 和 色度來指定像素的顏色,而不是一般使用的三原色來指定。
例以下圖:

YUV444
YUV444

上圖是一個 YUV444 的圖像格式。

  • Y 表明明亮度,也即灰階值
  • UV 表明色度,是描述影像色彩及飽和度,用於指定像素的顏色
  • 關於 YUVRGB 是如何互相轉換的,您能夠 參見這裏

灰階值是什麼?

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
複製代碼



RGB 比例基本與 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 圖像採集格式主要包含 YUV422YUV420 這兩種採集方式,而 I420NV21 剛好是這種數據採集方式,YUV420 數據採集大概是下面這種方式:

YUV420
YUV420

針對 YUV420 這種採用方式,有如下幾個特色:

  • 每一個像素的 Y 份量必須採集
  • 採集時,每一行只掃描一種份量【或 UV】,並且採樣比例爲 Y : U【V】 = 2 : 1
  • 由於存在隔行採樣,存在上下行像素的共用狀況,所以,通常而言此類格式的圖像寬和高值均爲偶數

如上圖,你會發現,每一個像素本來均包含 Y U V三個份量,而在進行 YUV420 採樣的時候,每一個 Y 份量都進行了採集,而 UV 份量並不是每一行都採集,而是先採集一行 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

UV 份量總佔用爲 :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

既然都是YUV420格式的,I420 和 NV21 到底有何區別?

針對基於 YUV 4:2:0 採樣的格式,主要分爲兩種類型:

  • YUV420P
    • YU12,即I420
    • YV12
  • YUV420SP
    • NV12
    • NV21

也就是說 I420 是屬於 YUV420P 這種類型的,這種類型的格式存儲有如下特色:

  • 都是基於 Planar模式【平面模式】進行存儲的
  • 在存儲時,先存儲全部的 Y 份量,而後在存儲 UV 份量
  • 若是先存儲的是 U 份量,再存儲的是 V 份量,則這種格式即 YU12 格式,即咱們所說的 I420 格式
  • 若是先存儲的是 V 份量,再存儲的是 U 份量,則這種格式即 YV12 格式

以下圖,即爲 一個分辨率爲 8 * 4I420圖像的存儲格式圖:

I420
I420

咱們能夠把這種存儲方式理解成三層,其中第一層固定存儲 Y 份量,第二和第三層根據實際格式分別存儲 UV(或 VU

一樣的,對應的 NV21 圖像格式,它是屬於 YUV420SP 這種類型的,此類型的存儲格式有如下特色:

  • 一樣都是屬於Planar模式【平面模式】進行存儲的,而嚴格上來講,是屬於 biplanar 模式【雙平面模式】
  • 在存儲時,先存儲全部的 Y 份量,而後再將 U V 兩個份量交替連續存儲
  • 若是以 UV 的循序交替存儲時,則爲 NV12 格式
  • 若是以 VU 的循序交替存儲時,則爲 NV21 格式

下圖爲一個分辨率爲 8 * 4NV21 格式圖像存儲圖:

NV21
NV21

至此,關於 I420NV21 這兩種圖像格式就介紹完了,有關更多的關於 YUV 的其餘格式,可點擊 此處 進行了解。

總結

  • 圖像所佔內存大小跟圖像的實際格式及其相關
  • 每一個格式的圖像都有本身對應的步長【或步幅】值,從在存儲器一行像素在存儲器像素的下一行的字節數
  • RGB_565 格式圖像步幅爲:寬 * 2
  • RGB24 格式圖像步幅爲:寬 * 3
  • ARGB_8888 格式圖像步幅爲:寬 * 4
  • I420NV21 格式圖像步幅爲: 寬 * 1.5
  • 圖像在內存中所佔用的字節大小,一般爲 圖像的高 * 步長
  • 對於 I420NV21 兩種格式的圖像,因涉及到隔行採樣,上下行像素共用問題,通常此類圖像的寬和高均爲偶數

參考資料

相關文章
相關標籤/搜索