HarmonyOS 鸿蒙Next PC相机预览旋转问题适配指导

HarmonyOS 鸿蒙Next PC相机预览旋转问题适配指导

一、场景介绍

在MateBook Fold Ultimate机器上,安装的部分应用调用系统相机时,预览成像旋转90°。

二、规范标准

2.1 屏幕旋转角度的定义

显示设备的屏幕顺时针旋转角度,简称为屏幕旋转角度,即设备从自然方向到当前方向的顺时针夹角。

参考链接:屏幕旋转角度

2.2 镜头安装角度的定义

相机镜头安装角度指相机采集图像方向到设备自然方向在顺时针方向的夹角。

参考链接:相机镜头安装角度

2.3 预览旋转角度的定义

在预览时,图像旋转角度与屏幕显示旋转角度相关。系统将以原始图像方向为基线,根据相机镜头角度和屏幕显示补偿角度,旋转图像。

计算公式:图像旋转角度 = 镜头安装角度 + 屏幕显示补偿角度,屏幕显示补偿角度的值与屏幕旋转角度相等。

参考链接:预览旋转角度

2.4 相机预览图像过程中的处理方式

2.4.1 针对ArkTS侧的三方应用:

在开发相机应用时,需要先参考开发准备申请相关权限。预览是启动相机后看见的画面,通常在拍照和录像前执行。

参考相机开发指南:预览 (ArkTS)

(1)获取预览旋转角度

首先,获取设备的屏幕旋转角度displayRotation,通过getDefaultDisplaySync函数获取Display对象并读取对应属性值。然后通过调用PreviewOutput类中的getPreviewRotation接口,获取预览旋转角度previewRotation。不同机型的镜头安装角度不同,相同机型的镜头安装角度唯一,系统已将镜头安装角度补充至最终的预览旋转角度中。

若要自行获取镜头安装角度,可以参考API getPreviewRotation

import { display } from '@kit.ArkUI';  
let displayRotation = display.getDefaultDisplaySync().rotation;//屏幕旋转角度  
let previewRotation = previewOutput.getPreviewRotation(displayRotation* camera.ImageRotation.ROTATION_90);//单位转化

(2)设置图像的预览旋转角度

通过调用PreviewOutput类中的setPreviewRotation接口,设置图像的预览旋转角度。

previewOutput.setPreviewRotation(previewRotation, isDisplayLocked);

其中previewRotation为上述获取的预览旋转角度。isDisplayLocked表示是否旋转锁定,即是否已调用接口setXComponentSurfaceRotation,当设置为true,屏幕旋转锁定,不跟随窗口变化,旋转角度仅取相机镜头角度计算;当设置为false,旋转角度=相机镜头角度+屏幕旋转角度。

参考链接:setPreviewRotation

(3)ArkTS侧的预览接口示例

import { display } from '@kit.ArkUI'; 

// previewOutput初始值 
let initDisplayRotation = display.getDefaultDisplaySync().rotation; 
let initPreviewRotation = previewOutput.getPreviewRotation(initDisplayRotation * camera.ImageRotation.ROTATION_90); 
previewOutput.setPreviewRotation(initPreviewRotation, false); 
// previewOutput实时更新 
display.off('change'); 
display.on('change', () => { 
  initDisplayRotation = display.getDefaultDisplaySync().rotation; 
  let imageRotation = initDisplayRotation * camera.ImageRotation.ROTATION_90; 
  let previewRotation = previewOutput.getPreviewRotation(imageRotation); 
  previewOutput.setPreviewRotation(previewRotation, false); 
});

参考链接:预览

(4)利用setXComponentSurfaceRect接口也可完成ArkTS侧的适配

参考链接:创建 XComponent

(5)运行视频

2.4.2 针对C/C++侧的三方应用:

参考开发步骤:预览 (C/C++)预览流二次处理 (C/C++)

通过OH_PreviewOutput_GetPreviewRotation()获取预览旋转角度。如下:

Camera_ErrorCode OH_PreviewOutput_GetPreviewRotation(Camera_PreviewOutput *previewOutput, int displayRotation, Camera_ImageRotation* imageRotation)

参数:

参数 描述
Camera_PreviewOutput * previewOutput 用于获取预览旋转角度的预览输出实例。
int displayRotation 当前显示的旋转角度。
Camera_ImageRotation * imageRotation 预览旋转角度结果。

通过OH_PreviewOutput_SetPreviewRotation()设置相机预览旋转角度。如下:

Camera_ErrorCode OH_PreviewOutput_SetPreviewRotation(Camera_PreviewOutput* previewOutput, Camera_ImageRotation* previewRotation, bool isDisplayLocked)

参数:

参数 描述
Camera_PreviewOutput * previewOutput 用于设置预览旋转角度的预览输出实例。
Camera_ImageRotation previewRotation 预览的显示旋转角度。
bool isDisplayLocked 是否调用接口setXComponentSurfaceRotationtrue表示已调用Surface锁定。

2.4.2.1 应用对接预览流二次处理场景下的问题

若三方应用接口对接预览流二次处理时,系统无法将镜头安装角度补充到预览旋转角度中,导致不能使用系统现有能力,因此向应用提供两种方案:

  • 若应用不需要非镜像成像,建议应用在预览流二次处理后,直接套用系统现有的角度计算方法,应用补偿相机镜头安装角度进行适配。
  • 若应用需要非镜像成像,建议应用在预览流二次处理后,自行开发一套角度计算公式,应用自行适配(非镜像成像场景下,自行适配的性能大大优于补偿相机镜头安装角度的方法)。

更多关于HarmonyOS 鸿蒙Next PC相机预览旋转问题适配指导的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next PC相机预览旋转问题适配需通过调整相机参数实现。在Ability中使用Camera API时,通过setDisplayOrientation()方法设置预览方向,参数需与设备物理旋转角度匹配。在config.json中声明相机权限"ohos.permission.CAMERA"。预览旋转角度计算需结合设备传感器方向与屏幕自然方向,使用WindowManager获取当前窗口旋转状态。图形缓冲区处理需使用OH_NativeWindow_setBuffersGeometry()设置正确宽高比。硬编解码场景需同步调整MediaRecorder的setOrientationHint()参数。

更多关于HarmonyOS 鸿蒙Next PC相机预览旋转问题适配指导的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS Next PC相机预览旋转问题,建议按以下步骤进行适配:

  1. 对于ArkTS应用:
  • 使用display.getDefaultDisplaySync().rotation获取屏幕旋转角度
  • 通过previewOutput.getPreviewRotation()计算预览旋转角度
  • 调用previewOutput.setPreviewRotation()设置正确的旋转角度
  • 监听display.on('change')事件实时更新旋转角度
  1. 对于C/C++应用:
  • 使用OH_PreviewOutput_GetPreviewRotation()获取预览旋转角度
  • 调用OH_PreviewOutput_SetPreviewRotation()设置旋转角度
  1. 关键计算公式: 预览旋转角度 = 镜头安装角度 + 屏幕旋转角度

  2. 特殊场景处理:

  • 预览流二次处理时需自行补偿镜头安装角度
  • 非镜像成像场景建议自行开发角度计算逻辑
  1. 注意事项:
  • 不同设备的镜头安装角度可能不同
  • 屏幕旋转变化时需要及时更新预览角度
  • 使用setXComponentSurfaceRotation可锁定旋转

建议参考官方文档中的示例代码实现完整适配流程。

回到顶部