我假设你正在使用Camera API的预览回调,你会得到每帧的byte []数组.
首先,您需要选择要使用的YUV格式.需要支持NV21,自Android 3.0起需要YV12.其他格式均不保证可用.因此NV21是最安全的选择,也是默认选择.
这两种格式都是YUV 4:2:0格式; 颜色信息在两个维度上被二次采样,并且图像数据的布局与标准交错RGB格式相当不同.FourCC.org的NV21描述作为一个源,具有您想要的布局信息 - 首先是Y平面,然后是UV数据交错.但由于两个颜色平面只有Y平面大小的1/4,因此您必须决定如何对它们进行上采样 - 最简单的是最近邻.因此,如果您想要大小(w,h)的图像中的像素(x,y),则最近邻居方法是:
Y = image[ y * w + x];
U = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 1]
V = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 0]
Run Code Online (Sandbox Code Playgroud)
也可以使用色度通道的更复杂的上采样(双线性,立方体等),但是什么是合适的取决于应用.
拥有YUV像素后,您需要解释它.如果您更喜欢在RGB中操作,可以在维基百科上使用这些JPEG转换公式来获取RGB值.
或者,你可以使用V(Cr)的大正值来表示红色,特别是如果U(Cb)很小.