• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 拍照
2
3拍照是相机的最重要功能之一,拍照模块基于相机复杂的逻辑,为了保证用户拍出的照片质量,在中间步骤可以设置分辨率、闪光灯、焦距、照片质量及旋转角度等信息。
4
5## 开发步骤
6
7详细的API说明请参考[Camera API参考](../reference/apis/js-apis-camera.md)。
8
91. 导入image接口。创建拍照输出流的SurfaceId以及拍照输出的数据,都需要用到系统提供的image接口能力,导入image接口的方法如下。
10
11   ```ts
12   import image from '@ohos.multimedia.image';
13   ```
14
152. 获取SurfaceId。
16
17   通过image的createImageReceiver方法创建ImageReceiver实例,再通过实例的getReceivingSurfaceId方法获取SurfaceId,与拍照输出流相关联,获取拍照输出流的数据。
18
19   ```ts
20   function getImageReceiverSurfaceId() {
21       let receiver = image.createImageReceiver(640, 480, 4, 8);
22       console.info('before ImageReceiver check');
23       if (receiver !== undefined) {
24         console.info('ImageReceiver is ok');
25         let photoSurfaceId = receiver.getReceivingSurfaceId();
26         console.info('ImageReceived id: ' + JSON.stringify(photoSurfaceId));
27       } else {
28         console.info('ImageReceiver is not ok');
29       }
30   }
31   ```
32
333. 创建拍照输出流。
34
35   通过CameraOutputCapability类中的photoProfiles()方法,可获取当前设备支持的拍照输出流,通过createPhotoOutput()方法传入支持的某一个输出流及步骤一获取的SurfaceId创建拍照输出流。
36
37   ```ts
38   let photoProfilesArray = cameraOutputCapability.photoProfiles;
39   if (!photoProfilesArray) {
40       console.error("createOutput photoProfilesArray == null || undefined");
41   }
42   let photoOutput;
43   try {
44       photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId);
45   } catch (error) {
46      console.error('Failed to createPhotoOutput errorCode = ' + error.code);
47   }
48   ```
49
504. 参数配置。
51
52   配置相机的参数可以调整拍照的一些功能,包括闪光灯、变焦、焦距等。
53
54   ```ts
55   // 判断设备是否支持闪光灯
56   let flashStatus;
57   try {
58       flashStatus = captureSession.hasFlash();
59   } catch (error) {
60       console.error('Failed to hasFlash. errorCode = ' + error.code);
61   }
62   console.info('Promise returned with the flash light support status:' + flashStatus);
63   if (flashStatus) {
64       // 判断是否支持自动闪光灯模式
65       let flashModeStatus;
66       try {
67           let status = captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO);
68           flashModeStatus = status;
69       } catch (error) {
70           console.error('Failed to check whether the flash mode is supported. errorCode = ' + error.code);
71       }
72       if(flashModeStatus) {
73           // 设置自动闪光灯模式
74           try {
75               captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO);
76           } catch (error) {
77               console.error('Failed to set the flash mode. errorCode = ' + error.code);
78           }
79       }
80   }
81   // 判断是否支持连续自动变焦模式
82   let focusModeStatus;
83   try {
84       let status = captureSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
85       focusModeStatus = status;
86   } catch (error) {
87       console.error('Failed to check whether the focus mode is supported. errorCode = ' + error.code);
88   }
89   if (focusModeStatus) {
90       // 设置连续自动变焦模式
91       try {
92           captureSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
93       } catch (error) {
94          console.error('Failed to set the focus mode. errorCode = ' + error.code);
95       }
96   }
97   // 获取相机支持的可变焦距比范围
98   let zoomRatioRange;
99   try {
100       zoomRatioRange = captureSession.getZoomRatioRange();
101   } catch (error) {
102       console.error('Failed to get the zoom ratio range. errorCode = ' + error.code);
103   }
104   // 设置可变焦距比
105   try {
106       captureSession.setZoomRatio(zoomRatioRange[0]);
107   } catch (error) {
108       console.error('Failed to set the zoom ratio value. errorCode = ' + error.code);
109   }
110   ```
111
1125. 触发拍照。
113
114   通过photoOutput类的capture()方法,执行拍照任务。该方法有两个参数,第一个参数为拍照设置参数的setting,setting中可以设置照片的质量和旋转角度,第二参数为回调函数。
115
116   ```ts
117   let settings = {
118       quality: camera.QualityLevel.QUALITY_LEVEL_HIGH,                                     // 设置图片质量高
119       rotation: camera.ImageRotation.ROTATION_0,                                           // 设置图片旋转角度0
120       location: captureLocation,                                                           // 设置图片地理位置
121       mirror: false                                                                        // 设置镜像使能开关(默认关)
122   };
123   photoOutput.capture(settings, async (err) => {
124       if (err) {
125           console.error('Failed to capture the photo ${err.message}');
126           return;
127       }
128       console.info('Callback invoked to indicate the photo capture request success.');
129   });
130   ```
131
132## 状态监听
133
134在相机应用开发过程中,可以随时监听拍照输出流状态,包括拍照流开始、拍照帧的开始与结束、拍照输出流的错误。
135
136- 通过注册固定的captureStart回调函数获取监听拍照开始结果,photoOutput创建成功时即可监听,拍照第一次曝光时触发,该事件返回此次拍照的captureId。
137
138  ```ts
139  photoOutput.on('captureStart', (captureId) => {
140      console.info(`photo capture stated, captureId : ${captureId}`);
141  })
142  ```
143
144- 通过注册固定的captureEnd回调函数获取监听拍照结束结果,photoOutput创建成功时即可监听,该事件返回结果为拍照完全结束后的相关信息[CaptureEndInfo](../reference/apis/js-apis-camera.md#captureendinfo)。
145
146  ```ts
147  photoOutput.on('captureEnd', (captureEndInfo) => {
148      console.info(`photo capture end, captureId : ${captureEndInfo.captureId}`);
149      console.info(`frameCount : ${captureEndInfo.frameCount}`);
150  })
151  ```
152
153- 通过注册固定的error回调函数获取监听拍照输出流的错误结果。callback返回拍照输出接口使用错误时的对应错误码,错误码类型参见[CameraErrorCode](../reference/apis/js-apis-camera.md#cameraerrorcode)。
154
155  ```ts
156  photoOutput.on('error', (error) => {
157      console.info(`Photo output error code: ${error.code}`);
158  })
159  ```
160