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

MAUI-Android Camera2:如何正确设置CaptureRequest的旋转与裁剪

Android Camera2:正确设置CaptureRequest的旋转与裁剪参数

核心问题说明

ScalerRotateAndCrop180这类单个角度的旋转键已被废弃,官方要求统一使用CaptureRequest.SCALER_ROTATE_AND_CROP键搭配ScalerRotateAndCropType枚举值来配置旋转逻辑。你之前传null是错误用法,自然不会有旋转效果。

正确实现步骤

1. 先确认设备支持的旋转裁剪模式

不是所有设备都支持全角度旋转,先通过相机特性获取支持的模式列表,避免设置无效值:

CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
int[] supportedRotateCropModes = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_ROTATE_AND_CROP_MODES);

可以打印这个数组,检查目标旋转模式(比如ROTATE_180)是否在列表中。

2. 配置旋转参数

使用ScalerRotateAndCropType的枚举值直接赋值,而不是传null:

// 示例:设置180度旋转(需确认设备支持)
builder.set(CaptureRequest.SCALER_ROTATE_AND_CROP, ScalerRotateAndCropType.ROTATE_180);

常用的枚举值包括:

  • ScalerRotateAndCropType.NONE:无旋转裁剪
  • ScalerRotateAndCropType.ROTATE_90:顺时针旋转90度
  • ScalerRotateAndCropType.ROTATE_180:顺时针旋转180度
  • ScalerRotateAndCropType.ROTATE_270:顺时针旋转270度

3. 搭配裁剪矩形(如果需要)

如果同时需要裁剪,要设置SCALER_CROP_REGION,注意裁剪区域的坐标基于传感器原始方向,而非最终输出方向:

// 获取传感器的有效区域
Rect sensorActiveArray = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
// 示例:裁剪中心50%的区域
int cropWidth = sensorActiveArray.width() / 2;
int cropHeight = sensorActiveArray.height() / 2;
Rect cropRegion = new Rect(
    (sensorActiveArray.width() - cropWidth) / 2,
    (sensorActiveArray.height() - cropHeight) / 2,
    (sensorActiveArray.width() + cropWidth) / 2,
    (sensorActiveArray.height() + cropHeight) / 2
);
builder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion);

常见坑点

  • 如果设置了设备不支持的旋转模式,系统会直接忽略该参数,导致无旋转效果,一定要先校验支持列表。
  • 裁剪区域的坐标是传感器原生方向,比如传感器是横置的,即使你设置了旋转,裁剪区域的计算仍要基于原生尺寸,系统会自动帮你映射到旋转后的输出。
  • 部分设备可能要求必须同时设置裁剪区域才能触发旋转效果,如果只需要旋转,可设置裁剪区域为传感器全尺寸(即sensorActiveArray本身)。

内容的提问来源于stack exchange,提问作者CactusJack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:56:07