如何借助Camera2Interop拍摄RAW格式图像
解决CameraX结合Camera2Interop拍摄RAW图像的正确方式
不需要直接调用Camera2的ImageCaptureSession.capture(),CameraX的ImageCapture配合Camera2Interop.Extender就能实现RAW拍摄,还能避免直接操作Camera2会话带来的兼容性问题,具体步骤如下:
1. 创建支持RAW的ImageCapture实例
通过Camera2Interop.Extender修改ImageCapture的内部配置,指定RAW格式的捕获参数:
// 可选:获取相机支持的RAW尺寸,适配不同设备 val cameraInfo = cameraProvider.bindToLifecycle(...) // 你的CameraInfo实例 val rawSize = cameraInfo.getCameraCharacteristic(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) ?.getOutputSizes(ImageFormat.RAW_SENSOR)?.firstOrNull() val imageCaptureBuilder = ImageCapture.Builder() .apply { rawSize?.let { setTargetResolution(it) } Camera2Interop.Extender(this).apply { // 配置RAW捕获核心参数 setCaptureRequestOption( CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON ) setCaptureRequestOption( CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO ) // 根据需求设置图像方向 setCaptureRequestOption( CaptureRequest.JPEG_ORIENTATION, Surface.ROTATION_0 ) } } val imageCapture = imageCaptureBuilder.build()
2. 调用takePicture获取RAW数据
使用OnImageCapturedCallback接收RAW格式的ImageProxy,不要用文件保存类的回调(RAW无法直接存为普通图片文件):
imageCapture.takePicture( ContextCompat.getMainExecutor(context), object : ImageCapture.OnImageCapturedCallback() { override fun onCaptureSuccess(image: ImageProxy) { // 验证是否为RAW格式 if (image.format == ImageFormat.RAW_SENSOR) { val rawImage = image.image // 获取Camera2原生Image对象 // 处理RAW数据,比如用DngCreator转换为DNG格式、提取像素信息等 rawImage?.use { // 自定义处理逻辑 } } image.close() // 必须关闭ImageProxy,避免内存泄漏 } override fun onError(exception: ImageCaptureException) { // 处理捕获错误,比如日志打印、用户提示 } } )
关键注意事项
- 不要自行连接
ImageReader到CameraX内部的CameraCaptureSession:CameraX的会话管理是封装好的,直接操作会导致会话被重置、资源冲突等问题。 - 设备兼容性检查:并非所有设备都支持
ImageFormat.RAW_SENSOR,可以提前判断:val supportsRaw = cameraInfo.getCameraCharacteristic(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) ?.contains(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW) == true - RAW数据处理:RAW格式的
Image不能直接解码为Bitmap,需要用专门的工具类(比如Android自带的DngCreator)转换为可存储的格式。
内容的提问来源于stack exchange,提问作者Hyeon U Kim
相关产品推荐
相关产品推荐

