相机拍照,在实现一个相机应用之前必须先创建一个独立的相机设备,然后才能继续相机的其他操作。

相机拍照

HarmonyOS
2024-05-20 21:32:55
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
dickhome

在实现一个相机应用之前必须先创建一个独立的相机设备,然后才能继续相机的其他操作。相机设备创建的建议步骤如下:

1.通过camera.getCameraManager(Context context)方法获取唯一的CameraManager对象。

//创建CameraManager对象 
let cameraManager 
await camera.getCameraManager(globalThis.Context, (err, manager) => { 
if (err) { 
console.error('Failed to get the CameraManager instance ${err.message}'); 
return; 
} 
console.log('Callback returned with the CameraManager instance'); 
cameraManager = manager 
})

如果此步骤操作失败,相机可能被占用或无法使用。如果被占用,必须等到相机释放后才能重新获取CameraManager对象。

2.通过getCameras()方法,获取当前使用的设备支持的相机列表。相机列表中存储了当前设备拥有的所有相机ID,如果列表不为空,则列表中的每个ID都支持独立创建相机对象;否则,说明正在使用的设备无可用的相机,不能继续后续的操作。

13.//获取相机列表 
14.let cameraArray 
15.await cameraManager.getCameras((err, cameras) => { 
16.    if (err) { 
17.        console.error('Failed to get the cameras. ${err.message}'); 
18.        return; 
19.    } 
20.    console.log('Callback returned with an array of supported cameras: ' + cameras.length); 
21.    cameraArray = cameras 
22.}) 
23.for(let cameraIndex = 0; cameraIndex < cameraArray.length; cameraIndex++) { 
24.    console.log('cameraId : ' + cameraArray[cameraIndex].cameraId)                          //获取相机ID 
25.    console.log('cameraPosition : ' + cameraArray[cameraIndex].cameraPosition)              //获取相机位置 
26.    console.log('cameraType : ' + cameraArray[cameraIndex].cameraType)                      //获取相机类型 
27.    console.log('connectionType : ' + cameraArray[cameraIndex].connectionType)              //获取相机连接类型 
28.}

还可以继续获取相机相关静态信息:

  • 通过cameraArray[cameraIndex].cameraId获取相机ID;
  • 通过cameraArray[cameraIndex].cameraPosition获取相机位置;
  • 通过cameraArray[cameraIndex].cameraType获取相机类型;
  • 通过cameraArray[cameraIndex].connectionType获取相机链接类型。

3.根据相机位置,刷选出前置摄像头ID,再通过createCameraInput(cameraId: string))方法,创建相机输入流。再定义布尔类型isFrontCamera判断是否切换当前摄像头,可通过设置isFrontCamera进行摄像头前后切换。

30.//默认设置后置相机,通过设置isFrontCamera来切换相机 
31.let cameraId 
32.let cameraInput 
33.for(let cameraIndex = 0; cameraIndex < this.cameraArray.length; cameraIndex++) { 
34.   let faceType = this.cameraArray[cameraIndex].cameraPosition 
35.   switch(faceType) { 
36.   case camera.CameraPosition.CAMERA_POSITION_FRONT://前置相机 
37.     if(this.isFrontCamera){ 
38.          cameraId = this.cameraArray[cameraIndex].cameraId 
39.     } 
40.     break 
41.   case camera.CameraPosition.CAMERA_POSITION_BACK://后置相机 
42.     if(!this.isFrontCamera){ 
43.          cameraId = this.cameraArray[cameraIndex].cameraId 
44.     } 
45.     break 
46.   case camera.CameraPosition.CAMERA_POSITION_UNSPECIFIED: 
47.   default: 
48.     break 
49.   } 
50.} 
51.cameraInput = await this.cameraManager.createCameraInput(cameraId)

4.通过createPreviewOutput(surfaceId:string)方法,创建相机预览输出流。

53.let previewOutput 
54.camera.createPreviewOutput((globalThis.surfaceId), (err, output) => { 
55.    if (err) { 
56.        console.error('Failed to create the PreviewOutput instance. ${err.message}'); 
57.        return; 
58.    } 
59.    console.log('Callback returned with previewOutput instance'); 
60.    previewOutput = output 
61.});

5.通过createPhotoOutput(surfaceId:string)方法,创建相机拍照输出流。参数surfaceId是从imageReceiver 获取的Surface ID。

63.//创建ImageReceiver对象,并设置照片参数 
64.let imageReceiver = await image.createImageReceiver(1920, 1080, 4, 8) 
65.//获取照片显示SurfaceId 
66.let photoSurfaceId = await imageReceiver.getReceivingSurfaceId() 
67.//创建拍照输出流 
68.let photoOutput 
69.camera.createPhotoOutput((photoSurfaceId), (err, output) => { 
70.    if (err) { 
71.        console.error('Failed to create the PhotoOutput instance. ${err.message}'); 
72.        return; 
73.    } 
74.    console.log('Callback returned with the PhotoOutput instance.'); 
75.    photoOutput = output 
76.});

6.创建会话,并向回话中添加相机流。

78.//创建会话 
79.this.captureSession = await camera.createCaptureSession(globalThis.abilityContext) 
80.Logger.info(this.tag, 'createCaptureSession') 
81.//开始配置会话 
82.await this.captureSession.beginConfig() 
83.Logger.info(this.tag, 'beginConfig') 
84.//向会话中添加相机输入流 
85.await this.captureSession.addInput(cameraInput) 
86.//向会话中添加预览输入流 
87.await this.captureSession.addOutput(previewOutput) 
88.//向会话中添加拍照输出流 
89.await this.captureSession.addOutput(photoOutput) 
90.//提交会话配置 
91.await this.captureSession.commitConfig() 
92.//启动会话 
93.await this.captureSession.start()

7.拍照。

95.let settings = { 
96.    quality: camera.QualityLevel.QUALITY_LEVEL_HIGH                                      //设置图片质量高 
97.    rotation: camera.ImageRotation.ROTATION_0,                                           //设置图片旋转角度0 
98.} 
99.//使用当前拍照设置进行拍照 
100. photoOutput.capture(settings, (err) => { 
101.     if (err) { 
102.         console.error('Failed to capture the photo ${err.message}'); 
103.         return; 
104.     } 
105.     console.log('Callback invoked to indicate the photo capture request success.'); 
106. });

至此,相机设备的创建已经完成。

分享
微博
QQ
微信
回复
2024-05-21 17:29:50
相关问题
打开相机:直接使用相机拍照能力
1504浏览 • 1回复 待解决
HarmonyOS调用相机设备API获取失败问题
325浏览 • 1回复 待解决
HarmonyOS 相机拍照模糊
407浏览 • 0回复 待解决
HarmonyOS 拉起相机拍照
281浏览 待解决
如何调用系统相机拍照
1561浏览 • 1回复 待解决
HarmonyOS 相机-拍照之后预览
168浏览 • 1回复 待解决
对手机相机应用点建议
5103浏览 • 1回复 待解决
相机拍照界面应该怎样拉起?
363浏览 • 1回复 待解决
HarmonyOS APP无法打开相机拍照
320浏览 • 1回复 待解决
如何创建相机预览输出?
46浏览 • 0回复 待解决
HarmonyOS上如何控制相机拍照
58浏览 • 0回复 待解决
HarmonyOS 创建相机预览失败
440浏览 • 1回复 待解决
关于如何使用相机拍照模块拍照问题
1688浏览 • 0回复 待解决
HarmonyOS 相机旋转横屏拍照问题
118浏览 • 1回复 待解决