gpt4 book ai didi

android - 使用新的 Android camera2 api 从 YUV_420_888 进行 JPEG 编码时的绿色图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:56 31 4
gpt4 key购买 nike

我正在尝试使用新的相机 API。连拍太慢了,所以我在 ImageReader 中使用 YUV_420_888 格式,稍后再做一个 JPEG 编码,正如以下帖子中所建议的:

Android camera2 capture burst is too slow

问题是当我尝试使用 RenderScript 从 YUV_420_888 编码 JPEG 时得到绿色图像,如下所示:

RenderScript rs = RenderScript.create(mContext);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.YUV(rs)).setX(width).setY(height).setYuvFormat(ImageFormat.YUV_420_888);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);

Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

in.copyFrom(data);

yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);

Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmpout.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpegBytes = baos.toByteArray();

数据变量(YUV_420_888数据)获取自:

ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);

我在 JPEG 编码中做错了什么,只得到绿色的图像?

提前致谢

已编辑:这是我获得的绿色图像示例:

https://drive.google.com/file/d/0B1yCC7QDeEjdaXF2dVp6NWV6eWs/view?usp=sharing

最佳答案

所以这个问题有好几层的答案。

首先,我认为没有直接的方法可以将 YUV_420_888 数据的图像复制到 RS 分配中,即使分配的格式是 YUV_420_888。

因此,如果除了这个 JPEG 编码步骤之外,您没有将图像用于任何其他用途,那么您可以直接使用分配作为相机的输出,方法是使用 Allocation#getSurface。和 Allocation#ioReceive .然后您可以执行 YUV->RGB 转换并读出位图。

但是,请注意 JPEG 文件实际上存储 YUV 数据,因此当您压缩 JPEG 时,Bitmap 将在保存文件时进行另一次 RGB->YUV 转换。那么,为了获得最大效率,您可能希望将 YUV 数据直接提供给可以接受它的 JPEG 编码器,并完全避免额外的转换步骤。不幸的是,这无法通过公共(public) API 实现,因此您必须使用 JNI 代码并包含您自己的 libjpeg 副本或等效的 JPEG 编码库。

如果您不需要非常快速地保存 JPEG 文件,您可以将 YUV_420_888 数据混合成 NV21 byte[],然后使用 YuvImage,尽管您需要注意 YUV_420_888 数据的像素和行步长,并且将其正确映射到 NV21 - YUV_420_888 很灵活,可以表示几种不同类型的内存布局(包括 NV21),并且在不同设备上可能不同。因此,在将布局修改为 NV21 时,确保正确进行映射至关重要。

关于android - 使用新的 Android camera2 api 从 YUV_420_888 进行 JPEG 编码时的绿色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653927/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com