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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:34:51