android camera 参数

99ANYc3cd6
预计阅读时长 33 分钟
位置: 首页 参数 正文

Android 相机系统非常灵活,但同时也比较复杂,参数可以分为几个层面:

android camera 参数
(图片来源网络,侵删)
  1. Camera2 API (推荐): 这是现代 Android (API Level 21+) 的官方推荐相机 API,功能强大,控制粒度细,是专业相机应用开发的基础。
  2. CameraX (推荐): 这是一个 Jetpack 库,它封装了复杂的 Camera2 API,并提供了兼容性支持(回退到 Camera1),大大简化了开发,它基于 Camera2,所以参数本质上是相通的。
  3. Camera1 API (已废弃): 旧版 API,控制能力有限,不推荐新项目使用,但可能在维护旧应用时遇到。

下面我将主要围绕 Camera2 API 来详细介绍参数,并说明如何在 CameraX 中使用它们。


核心参数分类

我们可以将相机参数想象成一个物理相机的各种旋钮和设置,它们主要分为以下几类:

曝光相关参数

控制进光量,决定照片的亮度。

参数 对应物理概念 控制方法 作用
ISO 感光度 CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE 数值越高,感光能力越强,但画面噪点也越多,通常有自动和手动范围。
Shutter Speed (曝光时间) 快门速度 CameraCaptureSettings.exposureTime 传感器曝光的时间,时间越长,进光量越多,画面越亮,但时间过长可能导致运动模糊。
Aperture (光圈) 光圈值 (f-stop) CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES 镜头孔径的大小,f值越小(如 f/1.8),光圈越大,进光量越多,背景虚化效果也越明显。
AE (Auto-Exposure) 自动曝光 CaptureRequest.CONTROL_AE_MODE 控制相机是否自动调整曝光参数,常用值有 ON_AUTO, ON_ALWAYS_FLASH, OFF (手动) 等。
AEC (AE Lock) 曝光锁定 CaptureRequest.CONTROL_AE_LOCK 锁定当前曝光值,防止后续预览或拍摄时亮度突然变化。

对焦相关参数

控制相机的清晰度。

android camera 参数
(图片来源网络,侵删)
参数 对应物理概念 控制方法 作用
AF Mode (对焦模式) 对焦模式 CaptureRequest.CONTROL_AF_MODE 设置对焦方式。AUTO (自动连续对焦), MACRO (微距), CONTINUOUS_PICTURE (拍照时连续对焦), CONTINUOUS_VIDEO (视频时连续对焦), LOCKED (手动锁定)。
AF Regions (对焦区域) 对焦框 CaptureRequest.CONTROL_AF_REGIONS 定义一个或多个矩形区域,让相机优先对该区域进行对焦。
AF Trigger 对焦触发 CaptureRequest.CONTROL_AF_TRIGGER 手动触发对焦,常用值有 START (开始对焦), CANCEL (取消对焦)。
AFC (AF Lock) 对焦锁定 CaptureRequest.CONTROL_AF_LOCK 锁定当前对焦距离,防止焦点漂移。

白平衡相关参数

控制画面的色彩,使其在不同光源下看起来真实。

参数 对应物理概念 控制方法 作用
AWB Mode (白平衡模式) 白平衡模式 CaptureRequest.CONTROL_AWB_MODE 设置白平衡算法。AUTO (自动), INCANDESCENT (白炽灯), FLUORESCENT (荧光灯), DAYLIGHT (日光), CLOUDY_DAYLIGHT (阴天), LOCKED (手动锁定)。
AWB Regions (白平衡区域) 白平衡区域 CaptureRequest.CONTROL_AWB_REGIONS 定义相机在计算白平衡时参考的区域。
AWB Lock 白平衡锁定 CaptureRequest.CONTROL_AWB_LOCK 锁定当前白平衡设置。

闪光灯与测光相关参数

参数 对应物理概念 控制方法 作用
Flash Mode 闪光灯模式 CaptureRequest.FLASH_MODE OFF, ON, AUTO, TORCH (常亮手电筒)。
AEC (AE Regions) 测光区域 CaptureRequest.CONTROL_AE_REGIONS 定义相机在计算自动曝光时参考的区域,通常和对焦区域配合使用。

图像输出与格式相关参数

参数 对应物理概念 控制方法 作用
Preview Size 预览尺寸 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(SurfaceTexture.class) 设置预览画面的宽度和高度。
Picture Size 照片尺寸 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(ImageFormat.JPEG) 设置拍摄照片的分辨率。
Video Size 视频尺寸 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(MediaRecorder.class) 设置录制视频的分辨率。
Image Format 图像格式 ImageFormat.JPEG, ImageFormat.YUV_420_888, ImageFormat.RAW_SENSOR JPEG 为压缩格式,用于存储;YUV 用于处理(如人脸检测);RAW 为原始数据,用于专业后期。

拍摄控制参数

参数 对应物理概念 控制方法 作用
Scene Mode 场景模式 CaptureRequest.CONTROL_SCENE_MODE 自动优化一组参数以适应特定场景,如 PORTRAIT (人像), LANDSCAPE (风景), NIGHT (夜景), NIGHT_PORTRAIT (夜景人像)。
Effect Mode 特效模式 CaptureRequest.CONTROL_EFFECT_MODE 为画面添加特殊效果,如 MONO (黑白), SEPIA (棕褐色), NEGATIVE (底片)。
Stabilization 防抖 CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE OFF, ON (光学防抖),可以显著提高在运动或暗光下手持拍摄的清晰度。
Lens Facing 摄像头朝向 CameraCharacteristics.LENS_FACING FRONT (前置), BACK (后置), EXTERNAL (外置),用于选择使用哪个摄像头。

如何在 Camera2 API 中使用这些参数

使用 Camera2 API 的标准流程是 打开相机 -> 配置输出 -> 捕捉图像 -> 关闭相机

获取相机参数

你需要获取 CameraCharacteristics 对象,它包含了相机硬件的静态信息(只读)。

// 打开相机
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0]; // 获取后置摄像头ID
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
// 获取支持的参数范围
Range<Integer> isoRange = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);
Range<Long> exposureTimeRange = characteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
float[] apertures = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES);

配置并设置参数

创建一个 CaptureRequest.Builder,然后通过 set() 方法设置你想要的参数。

android camera 参数
(图片来源网络,侵删)
// 创建一个用于拍照的CaptureRequest.Builder
CameraCaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// --- 设置参数 ---
// 1. 曝光
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
captureRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, 800); // 设置ISO为800
captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L / 30); // 设置快门为1/30秒
// 2. 对焦
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 设置对焦区域 (一个矩形区域,归一化坐标 0.0f - 1.0f)
Rect afRegion = new Rect(100, 100, 300, 300); // 示例区域
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{new MeteringRectangle(afRegion, MeteringRectangle.METERING_WEIGHT_MAX)});
// 3. 白平衡
captureRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
// 4. 闪光灯
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_AUTO);
// 5. 图像旋转 (非常重要!)
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
int jpegOrientation = (sensorOrientation + rotation * 90) % 360;
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, jpegOrientation);
// 6. 将预览Surface加入请求
captureRequestBuilder.addTarget(surface);
// 构建最终的CaptureRequest
CaptureRequest captureRequest = captureRequestBuilder.build();

执行捕获

将配置好的 CaptureRequest 发送给相机设备进行拍照。

// cameraDevice是之前打开的CameraDevice实例
// captureSession是之前创建的CameraCaptureSession实例
cameraCaptureSession.capture(captureRequest, null, null);

如何在 CameraX 中使用这些参数

CameraX 的设计哲学是“声明式”的,你通过构建器 Preview.Builder, ImageCapture.Builder 等来声明你想要什么,而不是去操作底层的 CaptureRequest

基础设置

// 1. 定义UseCase
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// 2. 绑定到生命周期
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
    cameraProvider.unbindAll()
    cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageCapture)
}, ContextCompat.getMainExecutor(context))
// 3. 将Preview连接到PreviewView
preview.setSurfaceProvider(previewView.surfaceProvider)

设置 ImageCapture 参数

ImageCapture.Builder 提供了链式调用来配置参数,这些参数最终会映射到底层的 Camera2 参数。

val imageCapture = ImageCapture.Builder()
    // 设置捕捉模式 (单张/HDR)
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) // 或 CAPTURE_MODE_MAXIMIZE_QUALITY
    // 设置闪光灯模式
    .setFlashMode(ImageCapture.FLASH_MODE_AUTO) // FLASH_MODE_ON, FLASH_MODE_OFF, FLASH_MODE_SCREEN
    // 设置图像分析器 (可选)
    .setAnalyzer(Executors.newSingleThreadExecutor(), imageAnalyzer)
    // 设置拍照时的缩放比例
    .setZoomRatio(1.5f)
    // 设置目标旋转
    .setTargetRotation(previewView.display.rotation)
    // 设置拍照质量/分辨率
    .setTargetResolution(Size(4032, 3024)) // 设置目标尺寸,CameraX会自动选择最接近的
    .build()

动态修改参数 (对焦、曝光)

对于需要动态调整的参数(如点击对焦),CameraX 提供了 CameraControl

// 从 Preview 或 ImageCapture 获取 CameraControl
val cameraControl = previewView.cameraControl
// 在 PreviewView 上点击时,进行对焦
previewView.setOnTouchListener { view, event ->
    if (event.action == MotionEvent.ACTION_UP) {
        val meteringPointFactory = PreviewViewMeteringPointFactory(view)
        val action = FocusMeteringAction.Builder(meteringPointFactory.createPoint(event.x, event.y)).build()
        // 执行对焦和测光操作
        cameraControl.startFocusAndMetering(action)
            .addListener({
                // 对焦成功
            }, ContextCompat.getMainExecutor(context))
    }
    true
}

CameraX 的 FocusMeteringAction 会自动帮你设置 CONTROL_AF_MODE, CONTROL_AF_REGIONS, CONTROL_AE_REGIONS 等复杂的 Camera2 参数,非常方便。


重要注意事项

  1. 异步操作: Camera2 API 几乎所有核心操作都是异步的(打开相机、创建会话、捕获图像等),必须使用 CameraDevice.StateCallback, CameraCaptureSession.CaptureCallback 等回调来处理结果。
  2. 生命周期管理: 必须正确管理相机的生命周期,在 Activity/Fragment 的 onResume 中打开相机,在 onPause 中关闭,CameraX 通过 bindToLifecycle 自动处理了这一点,极大简化了开发。
  3. 线程: 相机操作必须在后台线程执行,但结果需要返回到主线程更新 UI,Camera2 需要手动处理线程切换,CameraX 则在内部封装好了。
  4. 性能: 高分辨率预览、连续对焦、人脸检测等操作会消耗大量 CPU/GPU 资源,要注意性能优化,避免内存泄漏和 ANR。
  5. 权限: 从 Android 6.0 (API 23) 开始,必须动态申请 CAMERAWRITE_EXTERNAL_STORAGE (如果需要保存照片) 权限。
特性 Camera2 API CameraX
定位 底层、强大、灵活 高层、简化、抽象
控制粒度 非常细,直接操作 CaptureRequest 通过 BuilderCameraControl 间接控制
代码复杂度 高,需要处理异步、线程、生命周期 低,声明式API,自动处理生命周期
兼容性 API 21+ 通过 Camera2 和 Camera1 支持 API 14+
适用场景 专业相机应用、需要极致控制 大多数应用、快速开发

对于新项目,强烈推荐使用 CameraX,它能让你专注于业务逻辑而不是复杂的相机细节,如果你需要 CameraX 没有提供的某些特殊功能,你仍然可以通过 Camera2Extender 来访问底层的 Camera2 API。

-- 展开阅读全文 --
头像
戴尔Inspiron 1420拆机步骤是怎样的?
« 上一篇 今天
大数据人工智能PPT模板有哪些实用功能?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]