Android Camera的预览数据格式Nv21简介
在Android中启用摄像头进行拍摄画面时,通常会涉及到预览的回调函数,参数一般是:byte[] data, Camera camera 。不进行转换的话,这里的byte[] data 就是Nv21格式的图像信息,而Nv21到底是什么样的图像格式呢?
1. 前置知识
熟悉的RGB 和不那么熟悉的YUV 都是一种人为定义的颜色空间,可以简单的认为是对图像的高度抽象后的系统,用来描述图像。就像人都可以抽象出这样一套系统:由眼、鼻、口、耳朵…等等器官组成的“对象”,同样也可以抽象出这样一套系统:姓名、出生年月…等等信息组成的“对象”,这两种“系统”将其中的信息具体化都可以用来描述某一个具体的人。同理,对于图像(视频看作是由许多张图像组成的)这样的对象,也有很多套描述系统。
1.1 RGB
RGB色彩模式是工业界的一种颜色标准,是通过对红?、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。——百度百科
加入透明度作为“描述项”的颜色空间时:RGBA
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像——https://www.cnblogs.com/faith0217/articles/4262913.html
1.2 YUV
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。 [1] ——百度百科
在 YUV 空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下改变。
YUV 使用RGB的信息,但它从全彩色图像中产生一个黑白图像,然后提取出三个主要的颜色变成两个额外的信号来描述颜色。把这三个信号组合回来就可以产生一个全彩色图像。
Y 通道描述 Luma 信号,它与亮度信号有一点点不同,值的范围介于亮和暗之间。 Luma 是黑白电视可以看到的信号。U (Cb) 和 V (Cr) 通道从红 (U) 和蓝 (V) 中提取亮度值来减少颜色信息量。这些值可以从新组合来决定红,绿和蓝的混合信号。——https://www.cnblogs.com/faith0217/articles/4262913.html
2. NV21
NV21 图像格式属于 YUV颜色空间中的YUV420SP 格式,每四个Y分量共用一组U分量和V分量,Y连续排序,U与V交叉排序。——https://www.jianshu.com/p/a8ae092bb8b8 排列方式如:
Y Y ? Y Y ? Y Y ? Y Y Y Y ? Y Y ? Y Y ? Y Y
Y Y ? Y Y ? Y Y ? Y Y Y Y ? Y Y ? Y Y ? Y Y
V U ? V U ? V U? V U
V U ? V U ? V U? V U
3. 总结:
所以Nv21其实就是用YUV 颜色空间来描述的一种格式,默认作为Android系统摄像头输出图像的格式,需要的时候,它可以向更常用的Bitmap 格式转换(参考:Nv21转Bitmap(高效率转化))。
|