我用YUV_420_888格式(YCbCr)在安卓系统上拍摄了一张图片。
图像维数是4032 X 3024,我从ImageReader得到三架飞机。
有12192768字节的y 具有6096383字节的U V有6096383字节
我的理解是,对于Y中的每个像素,在2:1的U/V平面上有一个对应的值(2像素Y对应于1像素U/V)。
但是做12192768/2的数学运算,U/V平面中缺少一个字节。
为什么少了一个字节?Y与U/V的关系如何
发布于 2020-05-29 16:41:37
好吧,让我们再试一次。最初,我问是否有人找到了答案,因为我也在寻找解决这个问题的办法。最后,尽管我已经找到了这个问题的答案:
答案在于图像采集格式。Android直到默认为NV21格式,这意味着在Y平面之后有一个V字节和一个U字节交织的平面。NV12是在V字节之前有U字节的备用(参见:How to render Android's YUV-NV21 camera image on the background in libgdx with OpenGLES 2.0 in real-time?)
然后,ImageReader返回的Image创建一个直接访问该内存位置的ByteBuffer。在isDirect上调用ByteBuffer ()验证了这一点。您还可以通过修改vBuffer (getPlane()2)索引1来看到这一点。由于vBuffer的索引1指向uBuffer索引0的相同内存位置,所以uBuffer.get(0)将是相同的。
因此,UV平面( NV21的VU平面)等于Y-plane/2=length (如上面示例中注意到的6096384 )。如果你从第一个V(VU-平面)开始,计数到最后一个V ( VU-planelength -1),它会少一个,因为这个平面上的最后一个字节是U,同样,第一个U字节在VU平面的索引1处,直到VU平面。
这里有一幅图像,希望能从视觉上解释上面的措辞:

这都是基于这样一个事实:图像是以NV21格式捕获的,而不是NV12或Y12。这是另一个很好的参考视觉(https://www.twblogs.net/a/5d7ede57bd9eee541c3480f3)
https://stackoverflow.com/questions/51399908
复制相似问题