android - camera2 api 将 yuv420 转换为 rgb 绿色输出

标签 android image android-camera yuv

我尝试将图像从 YUV_420_888 转换为 rgb,但我在输出图像时遇到了一些问题。在 ImageReader 中,我获取格式为 YUV_420_888 的图像(使用 camera 2 api 获取此图像预览)。

imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);

在android sdk中为YuvImage类编写,即YuvImage只使用了NV21、YUY2。

我们可以看到 N21 和 yuv420 之间的差异不大,我尝试将数据转换为 N21

YUV420: enter image description here

N21: enter image description here

onImageAvailable 中,我分别获取每个 Planes 并将它们放在正确的位置(如图所示)

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);

但我保存的图像是绿色和粉红色的: capture image capture image

我错过了什么??

最佳答案

我已经在 RenderScript 中实现了 YUV_420 逻辑(完全如上图所示),请在此处查看完整代码:

Conversion YUV_420 _888 to Bitmap, complete code

它为 API 22 生成完美的双图,但对于 API 21,它显示“绿色田园诗”。由此我可以确认,你找到的结果。正如 Silvaren 上面已经提到的,原因似乎是 API 21 中的 Android 错误。查看我的 rs 代码很明显,如果 U 和 V 信息丢失(即零),则 G(reen) ARGB 组件在转换。

我在我的 Galaxy S5 上看到了类似的绿色图片(仍然是 API 21)——这里甚至颠倒了 ;-)。我怀疑 API 21 的大多数设备目前还没有将 Camera2 用于他们的设备相机应用程序。有一个名为“手动相机兼容性”的免费应用程序可以对此进行测试。从这里我看到确实 S5/API21 仍然没有使用 Camera2...幸好没有...

关于android - camera2 api 将 yuv420 转换为 rgb 绿色输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542708/

相关文章:

android - 有没有办法从 adb shell 获取可用的相机分辨率?

android - 方向改变时手势清除

android - 将 google play/apple store 自动续订订阅与内部帐户同步的预期行为是什么?

java - 如何获取 Android 设备上已安装应用程序的列表

c# - 将 blob 字符串转换为 jpg 文件

java - 如何使用java将相机捕获的图像添加到Android中的imageviewer中?我尝试过以下代码

java - Android getSupportedPreviewSizes() on Camera 仅返回 3 个尺寸

android - 从 Kotlin 中的另一个类访问静态扩展函数?

android - 在android中以两秒的间隔时间按顺序显示图像

css - 使图像在 slider 中响应