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
相关产品推荐
相关产品推荐

