一、预备知识
YUV也叫YCbCr,Y表示明亮度(Luminance、Luma),U和V则是色度、浓度(Chrominance、Chroma)。Y、U和V三个分量的数据分别保存在三个Plane类中,可以通过getPlanes()得到。Plane实际是对ByteBuffer的封装。Image保证了plane #0一定是Y,#1一定是U,#2一定是V。且对于plane #0,Y分量数据一定是连续存储的,中间不会有U或V数据穿插,也就是说我们一定能够一次性得到所有Y分量的值。
YUV和RGB转换:
Y Y = 0.299 x R + 0.587 x G + 0.114 x B + 0
U Cb = -0.169 x R - 0.331 x G + 0.499 x B + 128
V Cr = 0.499 x R - 0.418 x G - 0.0813 x B + 128
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)
YUVFormats分成两个格式:
1、紧缩格式(packedformats):YUV是混合在一起的。
2、平面格式(planarformats):Y分量,U分量和V分量都是以独立的平面组织的
二、常见YUV
1、YUV444
其实就是YUV的数据各占用8位, 每个像素都由YUV组成
YYYYYYYYY VVVVVVVVV UUUUUUUU
2、YUV422
其实就是Y占用4位,U和V各占2位。
人对亮度比较敏感,而对色彩不怎么敏感。所以每个像素的亮度Y数据是绝对不动的,而色差数据可以进行丢弃
YYYYYYYY VVVV UUUU
3、YUV420
4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0以此类推。
每一行的相邻两个像素与下一行同位置的两个像素数据差异不大,可以进一步的丢数据。
YYYYYYYY VV UU
三、YUV420
参考文档:
YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
最简单解释 YUV444,YUV422,YUV420中的4,2,0
java – Android Camera2 API YUV_420_888到JPEG