根据 Mobile Vision API 文档,Frame 对象具有 getBitmap() 方法,但明确指出
getBitmap()
返回创建此帧时指定的位图,如果没有使用位图创建此帧,则返回 null。
如果你真的想得到 Bitmap 对象,你必须自己创建它。一种选择是在Frame 对象上使用getGrayscaleImageData() 方法。
如果返回的ByteBuffer中有字节,可以转换成Bitmap。
首先,您必须使用来自getGrayscaleImageData() 结果的字节数组创建YuvImage。这是一个强制性步骤,因为字节数组在YUV/YCbCr 颜色空间中具有图像,以NV21 格式编码。所以第一行看起来像这样:
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
width 和 height 可以通过 getMedatada().getHeight() / getMedatada().getWidth() 方法从帧中提取。
然后你可以使用ByteArrayOutputStream快速压缩你的YuvImage对象。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
从那里您可以再次将其转换为字节数组,最终在BitmapFactory 中使用它。
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
我知道与简单的getBitmap() 方法使用相比,它的代码很多,但如果您在这种情况下确实需要位图,它会完成这项工作。