Android Studio NDK Camera横屏预览旋转90/270度问题求助
横屏相机预览旋转问题解决方案
1. 调整相机输出方向
在ndkCamera.cpp的相机初始化/预览配置逻辑中,根据屏幕横屏状态设置正确的相机显示方向:
- 先获取当前屏幕的旋转角度,再结合相机传感器的固有方向,计算需要设置的预览旋转值。
- 若使用Camera2 API,在构建
CaptureRequest时添加以下配置:
// 获取屏幕旋转角度 int rotation = ANativeWindow_getOrientation(window); int target_rot = 0; switch (rotation) { case ANATIVEWINDOW_ROTATION_0: target_rot = 0; break; case ANATIVEWINDOW_ROTATION_90: target_rot = 90; break; case ANATIVEWINDOW_ROTATION_180: target_rot = 180; break; case ANATIVEWINDOW_ROTATION_270: target_rot = 270; break; } // 从CameraCharacteristics获取传感器方向 int sensor_orient = 0; camera_characteristics->get(CameraCharacteristics::SENSOR_ORIENTATION, &sensor_orient); // 计算最终需要设置的旋转角度(后置相机示例) int final_rot = (sensor_orient - target_rot + 360) % 360; // 应用到CaptureRequest request->set(CaptureRequest::CONTROL_ROTATION, final_rot);
- 若使用旧版Camera API,调用
camera_set_display_orientation接口传入计算后的角度即可。
2. 调整预览帧渲染旋转
如果相机方向配置无效,直接在预览帧处理阶段旋转画面:
找到ndkCamera.cpp中处理预览帧的回调函数,对原始帧进行旋转后再送入渲染或推理流程:
// 以ncnn Mat为例,旋转270度适配横屏 ncnn::Mat frame = ...; // 原始预览帧 ncnn::Mat rotated_frame = frame.transpose(1, 0); rotated_frame = rotated_frame.flip(1); // 根据实际预览方向调整翻转参数 // 后续使用rotated_frame进行渲染或推理
也可以用OpenCV的旋转函数实现:
cv::Mat cv_frame = ...; cv::Mat rotated_cv; cv::rotate(cv_frame, rotated_cv, cv::ROTATE_90_COUNTERCLOCKWISE); // 对应270度顺时针旋转
3. 锁定Activity方向
确保Activity的横屏状态稳定,避免系统自动调整方向干扰相机配置:
在Activity的onCreate方法中添加:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
同时保持Manifest中android:screenOrientation="landscape"的配置。
注意:不同设备的相机传感器方向可能存在差异,建议通过CameraCharacteristics动态获取,不要硬编码固定角度。
内容的提问来源于stack exchange,提问作者Chen Chen
相关产品推荐
相关产品推荐

