【发布时间】:2016-02-06 04:16:59
【问题描述】:
我尝试将图像从 YUV_420_888 转换为 rgb,但我在输出图像时遇到了一些问题。在 ImageReader 中,我以 YUV_420_888 格式获取图像(使用相机 2 api 获取此图像预览)。
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);
在android sdk 中为YuvImage 类编写,即YuvImage 只使用NV21、YUY2。
我们可以看到 N21 和 yuv420 之间的差异不大,我尝试将数据转换为 N21
在 onImageAvailable 中,我分别获取每个平面并将它们放在正确的位置(如图所示)
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteBuffer bufferY = image.getPlanes()[0].getBuffer();
byte[] data0 = new byte[bufferY.remaining()];
bufferY.get(data0);
ByteBuffer bufferU = image.getPlanes()[1].getBuffer();
byte[] data1 = new byte[bufferU.remaining()];
bufferU.get(data1);
ByteBuffer bufferV = image.getPlanes()[2].getBuffer();
byte[] data2 = new byte[bufferV.remaining()];
bufferV.get(data2);
...
outputStream.write(data0);
for (int i=0;i<bufferV.remaining();i++) {
outputStream.write(data1[i]);
outputStream.write(data2[i]);
}
创建YuvImage后,转换为Bitmap,查看并保存
final YuvImage yuvImage = new YuvImage(outputStream.toByteArray(), ImageFormat.NV21, 1920,1080, null);
ByteArrayOutputStream outBitmap = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0,1920, 1080), 95, outBitmap);
byte[] imageBytes = outBitmap.toByteArray();
final Bitmap imageBitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
mImageView.setImageBitmap(imageBitmap);
...
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);
我错过了什么?
【问题讨论】:
-
次要点:NV21 的图表实际上是错误的,它描述了 NV12 编码。 NV21是一样的,只是U和V互换了,即VUVUVUVUV而不是UVUVUVUVUV。
标签: android image android-camera yuv