文档管理中心

动态照片拍摄(ArkTS)

相机框架提供动态照片拍摄能力,业务应用可以类似拍摄普通照片一样,一键式拍摄得到动态照片。

应用开发动态照片主要分为以下步骤:

开发步骤

详细的API说明请参考@ohos.multimedia.camera (相机管理)

说明
  • 拍摄动态照片需要麦克风权限ohos.permission.MICROPHONE,权限申请和校验的方式请参考开发准备。否则拍摄的照片没有声音。
  1. 导入依赖,需要导入相机框架、媒体库、图片相关领域依赖。

    收起
    自动换行
    深色代码主题
    复制
    1. import { camera } from '@kit.CameraKit';
    2. import { photoAccessHelper } from '@kit.MediaLibraryKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
  2. 确定拍照输出流。

    通过CameraOutputCapability中的photoProfiles属性,可获取当前设备支持的拍照输出流,通过createPhotoOutput方法创建拍照输出流。

    收起
    自动换行
    深色代码主题
    复制
    1. function getPhotoOutput(cameraManager: camera.CameraManager,
    2. cameraOutputCapability: camera.CameraOutputCapability): camera.PhotoOutput | undefined {
    3. if (!cameraOutputCapability || !cameraOutputCapability.photoProfiles) {
    4. return;
    5. }
    6. let photoProfilesArray: Array<camera.Profile> = cameraOutputCapability.photoProfiles;
    7. if (!photoProfilesArray || photoProfilesArray.length === 0) {
    8. console.error("photoProfilesArray is null or []");
    9. return;
    10. }
    11. let photoOutput: camera.PhotoOutput | undefined = undefined;
    12. try {
    13. photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0]);
    14. } catch (error) {
    15. let err = error as BusinessError;
    16. console.error(`Failed to createPhotoOutput. error: ${err}`);
    17. }
    18. return photoOutput;
    19. }
  3. 查询当前设备当前模式是否支持动态照片能力。

    说明

    查询是否支持动态照片前需要先完成相机会话配置、提交和启动会话,详细开发步骤请参考会话管理

    收起
    自动换行
    深色代码主题
    复制
    1. function isMovingPhotoSupported(photoOutput: camera.PhotoOutput): boolean {
    2. let isSupported: boolean = false;
    3. try {
    4. isSupported = photoOutput.isMovingPhotoSupported();
    5. } catch (error) {
    6. // 失败返回错误码error.code并处理。
    7. let err = error as BusinessError;
    8. console.error(`The isMovingPhotoSupported call failed. error code: ${err.code}`);
    9. }
    10. return isSupported;
    11. }
  4. 使能动态照片拍照能力。

    说明

    使能动态照片前需要使能分段式拍照能力。

    收起
    自动换行
    深色代码主题
    复制
    1. function enableMovingPhoto(photoOutput: camera.PhotoOutput): void {
    2. try {
    3. photoOutput.enableMovingPhoto(true);
    4. } catch (error) {
    5. // 失败返回错误码error.code并处理。
    6. let err = error as BusinessError;
    7. console.error(`The enableMovingPhoto call failed. error code: ${err.code}`);
    8. }
    9. }
  5. 触发拍照,与普通拍照方式相同,请参考拍照

状态监听

在相机应用开发过程中,可以随时监听动态照片拍照输出流状态。通过注册photoAsset的回调函数获取监听结果,photoOutput创建成功时即可监听。

收起
自动换行
深色代码主题
复制
  1. function getPhotoAccessHelper(context: Context): photoAccessHelper.PhotoAccessHelper {
  2. let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
  3. return phAccessHelper;
  4. }
  5. async function mediaLibSavePhoto(photoAsset: photoAccessHelper.PhotoAsset,
  6. phAccessHelper: photoAccessHelper.PhotoAccessHelper): Promise<void> {
  7. try {
  8. let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset);
  9. assetChangeRequest.saveCameraPhoto();
  10. await phAccessHelper.applyChanges(assetChangeRequest);
  11. console.info('apply saveCameraPhoto successfully');
  12. } catch (err) {
  13. console.error(`apply saveCameraPhoto failed with error: ${err.code}, ${err.message}`);
  14. }
  15. }
  16. function onPhotoOutputPhotoAssetAvailable(photoOutput: camera.PhotoOutput, context: Context): void {
  17. photoOutput.on('photoAssetAvailable', (err: BusinessError, photoAsset: photoAccessHelper.PhotoAsset): void => {
  18. if (err) {
  19. console.error(`photoAssetAvailable error: ${err}.`);
  20. return;
  21. }
  22. console.info('photoOutPutCallBack photoAssetAvailable');
  23. // 调用媒体库落盘接口保存一阶段图和动态照片视频。
  24. mediaLibSavePhoto(photoAsset, getPhotoAccessHelper(context));
  25. });
  26. }

HDR动态照片

从API version 23开始,相机提供HDR动态照片拍摄能力,即组成动态照片的静态图片与动态短视频均为高动态范围(HDR)内容,能够在高光与暗部细节、色彩层次和整体质感方面优于SDR成片效果。

应用可以通过配置预览输出格式(Profile.format)和色彩空间(ColorSpace)灵活决定输出SDR/HDR动态照片。具体对应关系如下表所示,所有能力需先查后用,支持的预览输出格式通过接口getSupportedFullOutputCapability查询,支持的色彩空间通过接口getSupportedColorSpaces查询。

展开
静图动态范围 短视频动态范围 预览输出格式 色彩空间
SDR SDR CAMERA_FORMAT_YUV_420_SP SRGB
HDR SDR CAMERA_FORMAT_YUV_420_SP DISPLAY_P3
HDR HDR

CAMERA_FORMAT_YCRCB_P010、

CAMERA_FORMAT_YCBCR_P010

BT2020_HLG

HDR配置说明

  • 在配置预览输出流时,需要先通过接口getSupportedFullOutputCapability查询当前镜头和模式支持的完整能力,选择的预览输出格式为P010(CAMERA_FORMAT_YCRCB_P010/CAMERA_FORMAT_YCBCR_P010)。
  • 在配置色彩空间时,需要先通过接口getSupportedColorSpaces获取当前设备所支持的色彩空间,再通过接口setColorSpace设置色彩空间为BT2020_HLG。具体请参考setColorSpace说明。
在 指南 中进行搜索
请输入您想要搜索的关键词