ArCore的onUpdate方法获取Bitmap时出现Crop rect is unknown异常如何解决
异常原因
ARCore返回的ArImage实例未实现getCropRect()方法,官方设计上就不支持获取该类图像的裁剪区域,直接调用该接口就会抛出不支持操作异常。
解决方法
无需调用getCropRect()方法,直接使用图像全尺寸作为有效处理区域即可,修改imageToByteBuffer方法的对应代码:
- 替换原有获取裁剪区域的代码段
原有代码:
final Rect crop = image.getCropRect(); final int width = crop.width(); final int height = crop.height();
修改为:
// 直接使用ARCore返回图像的全尺寸作为有效区域 final int width = image.getWidth(); final int height = image.getHeight(); final int cropLeft = 0; final int cropTop = 0;
- 替换后续裁剪偏移的调用
原有代码:
buffer.position(rowStride * (crop.top >> shift) + pixelStride * (crop.left >> shift));
修改为:
buffer.position(rowStride * (cropTop >> shift) + pixelStride * (cropLeft >> shift));
额外优化建议
- 当前代码中获取bitmap后直接调用了
bitmap.recycle(),如果需要使用生成的bitmap,需要将回收逻辑移动到使用完bitmap之后执行,否则会得到已经被回收的无效bitmap。 - 100ms延迟的逻辑如果仅为了避免
ResourceExhaustedException,也可以替换为加处理标记,保证同一帧仅调用一次acquireCameraImage(),同时避免延迟导致的帧不同步问题。 - 每次处理都创建RenderScript实例性能开销较大,可以将RenderScript实例改为全局单例,页面销毁时再统一回收。
内容的提问来源于stack exchange,提问作者Andy Developer
相关产品推荐
相关产品推荐

