You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:02:13