相机实现预览和拍照,开发者通过调用HarmonyOS相机服务提供的接口可以开发相机应用

开发者通过调用HarmonyOS相机服务提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。


HarmonyOS
2024-05-21 22:15:10
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
xdpan

开发者通过调用HarmonyOS相机服务提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。

开发模型

相机调用摄像头采集、加工图像视频数据,精确控制对应的硬件,灵活输出图像、视频内容,满足多镜头硬件适配(如广角、长焦、TOF)、多业务场景适配(如不同分辨率、不同格式、不同效果)的要求。

相机的工作流程如图所示,可概括为相机输入设备管理、会话管理和相机输出管理三部分。

  • 相机设备调用摄像头采集数据,作为相机输入流。
  • 会话管理可配置输入流,即选择哪些镜头进行拍摄。另外还可以配置闪光灯、曝光时间、对焦和调焦等参数,实现不同效果的拍摄,从而适配不同的业务场景。应用可以通过切换会话满足不同场景的拍摄需求。
  • 配置相机的输出流,即将内容以预览流、拍照流或视频流输出。

开发流程:

相机工作流程

相机开发模型

相机应用开发的主要流程包含开发准备、设备输入、会话管理、预览、拍照和录像等。

  • 开发准备

在开发相机应用时,需要先申请相机相关权限,确保应用拥有访问相机硬件及其他功能的权限,需要的权限如下表。在申请权限前,请保证符合权限使用的基本原则



权限名




说明




授权方式


ohos.permission.CAMERA

允许应用使用相机拍摄照片和录制视频。

user_grant

ohos.permission.MICROPHONE

允许应用使用麦克风(可选)。

如需同时录制音频,需要申请该权限。

user_grant

ohos.permission.WRITE_MEDIA

允许应用读写用户外部存储中的媒体文件信息(可选)。

user_grant

ohos.permission.READ_MEDIA

允许应用读取用户外部存储中的媒体文件信息(可选)。

user_grant

ohos.permission.MEDIA_LOCATION

允许应用访问用户媒体文件中的地理位置信息(可选)。

user_grant


以上权限的授权方式均为user_grant(用户授权),即开发者在module.json5文件中配置对应的权限后,需要使用接口abilityAccessCtrl.requestPermissionsFromUser去校验当前用户是否已授权。如果是,应用可以直接访问/操作目标对象;否则需要弹框向用户申请授权。

  • 设备输入

在开发一个相机应用前,需要先创建一个独立的相机设备,应用通过调用和控制相机设备,完成预览、拍照和录像等基础操作

  • 会话管理

相机使用预览、拍照、录像、元数据功能前,均需要创建相机会话。

在会话中,可以完成以下功能:

  • 配置相机的输入流和输出流。相机在拍摄前,必须完成输入输出流的配置。

配置输入流即添加设备输入,对用户而言,相当于选择设备的某一摄像头拍摄;配置输出流,即选择数据将以什么形式输出。当应用需要实现拍照时,输出流应配置为预览流和拍照流,预览流的数据将显示在XComponent组件上,拍照流的数据将通过ImageReceiver接口的能力保存到相册中。

  • 添加闪光灯、调整焦距等配置。具体支持的配置及接口说明请参考Camera API参考
  • 会话切换控制。应用可以通过移除和添加输出流的方式,切换相机模式。如当前会话的输出流为拍照流,应用可以将拍照流移除,然后添加视频流作为输出流,即完成了拍照到录像的切换。

完成会话配置后,应用提交和开启会话,可以开始调用相机相关功能。

  • 预览

预览是启动相机后看见的画面,通常在拍照和录像前执行

  •  拍照

拍照是相机的最重要功能之一,拍照模块基于相机复杂的逻辑,为了保证用户拍出的照片质量,在中间步骤可以设置分辨率、闪光灯、焦距、照片质量及旋转角度等信息。

使用的核心API

拍照实现方案

核心代码解释

申请相机权限

设备输入

  • 通过getCameraManager()方法,获取cameraManager对象。
function getCameraManager(context: common.BaseContext): camera.CameraManager { 
let cameraManager: camera.CameraManager = camera.getCameraManager(context); 
return cameraManager; 
}
  • 通过cameraManager类中的getSupportedCameras()方法,获取当前设备支持的相机列表,列表中存储了设备支持的所有相机ID。若列表不为空,则说明列表中的每个ID都支持独立创建相机对象;否则,说明当前设备无可用相机,不可继续后续操作
function getCameraDevices(cameraManager: camera.CameraManager): Array<camera.CameraDevice> { 
let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras(); 
if (cameraArray != undefined && cameraArray.length <= 0) { 
  console.error("cameraManager.getSupportedCameras error"); 
  return []; 
} 
for (let index = 0; index < cameraArray.length; index++) { 
  console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID 
  console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 
  console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 
  console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 
} 
return cameraArray; 
}
  • 创建相机输入流
// 创建相机输入流 
let cameraInput: camera.CameraInput | undefined = undefined; 
try { 
  cameraInput = cameraManager.createCameraInput(cameraDevice); 
} catch (error) { 
  let err = error as BusinessError; 
  console.error('Failed to createCameraInput errorCode = ' + err.code); 
} 
if (cameraInput === undefined) { 
  return undefined; 
} 
// 监听cameraInput错误信息 
cameraInput.on('error', cameraDevice, (error: BusinessError) => { 
  console.info(`Camera input error code: ${error.code}`); 
}); 
// 打开相机 
await cameraInput.open();

创建相机输出流

相机预览和拍照

会话管理

// 会话流程 
cameraSession = cameraManager.createCaptureSession(); 
​ 
// 开始配置会话 
cameraSession.beginConfig(); 
​ 
// 把CameraInput加入到会话 
cameraSession.addInput(cameraInput); 
​ 
// 把 预览流 加入到会话 
cameraSession.addOutput(previewOutput) 
​ 
// 把 拍照流 加入到会话 
cameraSession.addOutput(photoOutPut); 
​ 
// 提交配置信息 
await cameraSession.commitConfig(); 
​ 
// 会话开始 
await cameraSession.start();/** 
   

实现效果

开发者通过调用HarmonyOS相机服务提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。

注明适配的版本信息

设备名称:

HUAWEI Mate 40 Pro

API版本:

11

软件版本:

NOH-AN00 4.1.0.23(SP15C00E24R1P15log)

分享
微博
QQ
微信
回复
2024-05-22 21:02:02
相关问题
如何调用系统相机拍照
405浏览 • 1回复 待解决
harmonyOS基于api9如何调用相机拍照
2219浏览 • 1回复 待解决
打开相机:直接使用相机拍照能力
390浏览 • 1回复 待解决
三方相机预览demo开发
461浏览 • 1回复 待解决
有哪位知道怎样调用系统相机拍照
462浏览 • 1回复 待解决
请教arkts可以调用相机了吗?
3290浏览 • 1回复 待解决
关于如何使用相机拍照模块拍照问题
537浏览 • 0回复 待解决
使用js语言如何开发相机
1600浏览 • 1回复 待解决
鸿蒙可以直接调用系统相机吗?
7151浏览 • 1回复 待解决
有无ArkTS编码规范可以提供开发者
496浏览 • 1回复 待解决
相机开发只支持 Java 吗?
1406浏览 • 1回复 待解决
如何连续获取相机预览流数据
127浏览 • 1回复 待解决
相机预览及切换摄像头
454浏览 • 1回复 待解决