gpt4 book ai didi

java - camera2 输出到位图

转载 作者:太空狗 更新时间:2023-10-29 13:53:57 26 4
gpt4 key购买 nike

我正在尝试使用 Google Mobile Vision API使用 camera2 模块,我遇到了很多麻烦。

我正在使用 Google 的 android-Camera2Video示例代码作为基础。我修改了它以包含以下回调:

Camera2VideoFragment.java

OnCameraImageAvailable mCameraImageCallback;

public interface OnCameraImageAvailable {
void onCameraImageAvailable(Image image);
}


ImageReader.OnImageAvailableListener mImageAvailable = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {

Image image = reader.acquireLatestImage();
if (image == null)
return;

mCameraImageCallback.onCameraImageAvailable(image);

image.close();
}
};

这样任何 fragment ,包括 Camera2VideoFragment.java 都可以访问它的图像。

现在,条码 API 只接受 Bitmap 图像,但我无法将 YUV_420_888 转换为 Bitmap。相反,我将 imageReader 的文件格式更改为 JPEG 并运行了以下转换代码:

    Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
buffer.rewind();
byte[] data = new byte[buffer.capacity()];
buffer.get(data);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

这行得通,但是将 JPEG 数据馈送到 imageReader 时帧率下降很明显。我想知道以前是否有人解决过这个问题。

最佳答案

迟到的回答,但希望仍然有用。

作为 Ezequiel Adrian 在他的 Example 上已经解释了将 YUV_420_888 转换为一种受支持的格式(在他的例子中是 NV21),你可以做类似的事情来获得你的位图输出:

private byte[] convertYUV420888ToNV21(Image imgYUV420) {
// Converting YUV_420_888 data to YUV_420_SP (NV21).
byte[] data;
ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();
int buffer0_size = buffer0.remaining();
int buffer2_size = buffer2.remaining();
data = new byte[buffer0_size + buffer2_size];
buffer0.get(data, 0, buffer0_size);
buffer2.get(data, buffer0_size, buffer2_size);
return data;}

然后你可以将结果转换成位图:

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

关于java - camera2 输出到位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773621/

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