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 |
是否调用接口setXComponentSurfaceRotation,true表示已调用Surface锁定。 |
2.4.2.1 应用对接预览流二次处理场景下的问题
若三方应用接口对接预览流二次处理时,系统无法将镜头安装角度补充到预览旋转角度中,导致不能使用系统现有能力,因此向应用提供两种方案:
(1)若应用不需要非镜像成像,建议应用在预览流二次处理后,直接套用系统现有的角度计算方法,应用补偿相机镜头安装角度进行适配。
(2)若应用需要非镜像成像,建议应用在预览流二次处理后,自行开发一套角度计算公式,应用自行适配(非镜像成像场景下,自行适配的性能大大优于补偿相机镜头安装角度的方法)。
更多推荐





所有评论(0)