Android下MLKit将Image转Bitmap返回null的解决及代码优化
问题解决与优化方案
为什么inputImage.getBitmapInternal()返回null?
getBitmapInternal()是Google ML Kit的内部私有API,并非公开可用的标准方法。当通过InputImage.fromMediaImage()创建实例时,InputImage不会自动将MediaImage转换为Bitmap存储,因此该方法返回null是预期行为,绝对不要依赖这个私有方法实现业务逻辑。
直接将MediaImage转换为Bitmap的最优方案
跳过InputImage的中间转换,直接从ImageReader获取的Image对象转换为Bitmap,避免不必要的性能损耗,代码如下:
Image image = imageReader.acquireLatestImage(); if (image == null) { // 处理图像获取失败的情况,比如直接返回或重试 return; } // 获取图像平面与缓冲区信息 Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); int pixelStride = planes[0].getPixelStride(); int rowStride = planes[0].getRowStride(); int rowPadding = rowStride - pixelStride * image.getWidth(); // 创建适配图像尺寸的Bitmap Bitmap bitmap = Bitmap.createBitmap( image.getWidth() + rowPadding / pixelStride, image.getHeight(), Bitmap.Config.ARGB_8888 ); bitmap.copyPixelsFromBuffer(buffer); // 绘制到Canvas canvas.drawBitmap(bitmap, 0, 0, new Paint(Paint.ANTI_ALIAS_FLAG)); // 务必回收资源,避免内存泄漏 image.close(); if (!bitmap.isRecycled()) { bitmap.recycle(); }
补充说明
Image对象必须调用close()回收,否则会导致相机资源泄漏,后续无法获取新图像。- 如果业务确实需要使用ML Kit的InputImage(比如后续做图像识别),可在得到Bitmap后再创建:
InputImage inputImage = InputImage.fromBitmap(bitmap, rotation); - 若图像格式为非YUV_420_888,需对应调整Plane的处理逻辑,上述代码适配常见的相机输出格式。
内容的提问来源于stack exchange,提问作者angel_30
相关产品推荐
相关产品推荐

