camera2输出到Bitmap
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了camera2输出到Bitmap相关的知识,希望对你有一定的参考价值。
我正在尝试使用Google Mobile Vision API和camera2模块,我遇到了很多麻烦。
我使用Google的android-Camera2Video示例代码作为基础。我修改它以包含以下回调:
camera2video fragment.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();
}
};
这样,包括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中),你可以做类似的事情来获得你的Bitmap输出:
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 bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
以上是关于camera2输出到Bitmap的主要内容,如果未能解决你的问题,请参考以下文章
Camera2 API 中的 Camera.PreviewCallback 等效项