HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库

HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库

可可图片编辑 HarmonyOS(2) 选择图片和保存到图库

前言

HarmonyOS 上架应用 可可图片编辑 APP中,大量使用到了读取相册图片和保存图片到图库的功能。这篇文章主要围绕这两个核心功能继续讲解,目前HarmonyOS 应用开发中 主要推荐使用Picker读取媒体库的图片与视频。使用保存控件/授权弹窗保存媒体库的图片与视频

https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/122/927/098/0300086000122927098.20250827085415.87526397288045144582805531560807:50001231000000:2800:9030CDE53BF1C29328C0C972DF255532CACA6F28F0DF61A35D582EB6E291669A.png

picker 选择图片

https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/122/927/098/0300086000122927098.20250827085421.53508447721619340777049620486081:50001231000000:2800:7A154EB81EDDE23C9CF02EF55B2D21DD9A54C7C1280F79C5D94606DFF50CFF3E.gif

Picker 可以实现直接选择图库图片或者拍照的方式获取图片,需要注意的是 使用 Picker 读取图片时,返回的该图片的uri信息。Picker读取图片。

1. 导入模块 photoAccessHelper 模块

import { photoAccessHelper } from '@kit.MediaLibraryKit';

import { BusinessError } from '@kit.BasicServicesKit';

photoAccessHelper 来自于 MediaLibraryKitMediaLibraryKit(媒体文件管理服务)提供了管理相册和媒体文件的能力,包括图片和视频,帮助应用快速构建图片和视频的展示与播放功能。

2. 设置选择图片的参数

PhotoSelectOptions继承自BaseSelectOptions。

BaseSelectOptions提供的配置主要有:

名称 类型 必填 说明
MIMEType PhotoViewMIMETypes 可选择的媒体文件类型,若无此参数,则默认为图片和视频类型。元服务API: 从API version 11开始,该接口支持在元服务中使用。
maxSelectNumber number 选择媒体文件数量的最大值(最大可设置的值为500,若不设置则默认为50)。元服务API: 从API version 11开始,该接口支持在元服务中使用。
isPhotoTakingSupported boolean 是否支持拍照,true表示支持,false表示不支持,默认为true。元服务API: 从API version 11开始,该接口支持在元服务中使用。
isSearchSupported boolean 是否支持搜索,true表示支持,false表示不支持,默认为true。元服务API: 从API version 11开始,该接口支持在元服务中使用。
recommendationOptions RecommendationOptions 图片推荐相关配置参数。元服务API: 从API version 11开始,该接口支持在元服务中使用。
preselectedUris Array 预选择图片的uri数据。元服务API: 从API version 11开始,该接口支持在元服务中使用。
isPreviewForSingleSelectionSupported boolean 单选模式下是否需要进大图预览,true表示需要,false表示不需要,默认为true。元服务API: 从API version 12开始,该接口支持在元服务中使用。
singleSelectionMode SingleSelectionMode 单选模式类型。默认为大图预览模式(SingleSelectionMode.BROWSER_MODE)。元服务API: 从API version 18开始,该接口支持在元服务中使用。
mimeTypeFilter MimeTypeFilter 文件类型的过滤配置,支持指定多个类型过滤。当配置mimeTypeFilter参数时,MIMEType的配置自动失效。配置该参数时,仅显示配置过滤类型对应的媒体文件,建议提示用户仅支持选择指定类型的图片/视频。元服务API: 从API version 19开始,该接口支持在元服务中使用。
fileSizeFilter FileSizeFilter 可选择媒体文件大小的过滤配置。配置该参数时,仅显示配置文件大小范围的媒体文件,建议提示用户仅支持选择指定大小的图片/视频。元服务API: 从API version 19开始,该接口支持在元服务中使用。
videoDurationFilter VideoDurationFilter 可选择媒体文件视频时长的过滤配置。配置该参数时,仅显示配置视频时长范围的媒体文件,建议提示用户仅支持选择指定时长视频。元服务API: 从API version 19开始,该接口支持在元服务中使用。
combinedMediaTypeFilter Array 将过滤条件配置为字符串数组,支持多种类型组合。字符串格式如下:photoType
photoViewMimeTypeFileSizeFilters Array<PhotoViewMimeTypeFileSizeFilter> 指定媒体文件类型和文件大小进行过滤。配置该参数时,仅取数组前三个参数进行处理,MIMETypes和fileSizeFilter自动失效。元服务API: 从API version 20开始,该接口支持在元服务中使用。

而 PhotoSelectOptions 提供的配置有:

名称 类型 必填 说明
isEditSupported boolean 是否支持编辑照片,true表示支持,false表示不支持,默认为true。元服务API: 从API version 11开始,该接口支持在元服务中使用。
isOriginalSupported boolean 是否显示选择原图按钮,true表示显示,false表示不显示,默认为true。元服务API: 从API version 12开始,该接口支持在元服务中使用。
subWindowName string 子窗口名称。元服务API: 从API version 12开始,该接口支持在元服务中使用。
completeButtonText CompleteButtonText 完成按钮显示的内容。完成按钮指在界面右下方,用户点击表示图片选择已完成的按钮。元服务API: 从API version 14开始,该接口支持在元服务中使用。

以下示例代码中主要使用了 MIMETypemaxSelectNumber

const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();

photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。

photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目。

3. 创建图片选择器

// 3 创建图片选择器

const photoViewPicker = new photoAccessHelper.PhotoViewPicker();

4. 开始选择图片

  // 4 开始选择图片

  photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {

    uris = photoSelectResult.photoUris;

    console.info('photoViewPicker.select to file succeed and uris are:' + uris);

  }).catch((err: BusinessError) => {

    console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);

  })

5. 打印输出

photoViewPicker.select to file succeed and uris are:file://media/Photo/1/IMG_1756079725_000/screenshot_20250825_075345.jpg

完整代码

// 1 导入模块 photoAccessHelper 模块

import { photoAccessHelper } from '@kit.MediaLibraryKit';

import { BusinessError } from '@kit.BasicServicesKit';

@ComponentV2

@Entry

struct Index {

  build() {

    Column({ space: 10 }) {

      Button("选择图片")

        .onClick(() => {

          // 2 设置选择图片的参数

          const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();

          photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。

          photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目。

          let uris: Array<string> = [];

          // 3 创建图片选择器

          const photoViewPicker = new photoAccessHelper.PhotoViewPicker();

          // 4 开始选择图片

          photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {

            uris = photoSelectResult.photoUris;

            console.info('photoViewPicker.select to file succeed and uris are:' + uris);

          }).catch((err: BusinessError) => {

            console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);

          })

        })

    }

    .width("100%")

    .height("100%")

    .justifyContent(FlexAlign.Center)

  }

}

SaveButton 安全控件 保存图片

应用可以通过安全控件授权弹窗的方式,将用户指定的媒体资源保存到图库中。授权弹窗的方式需要另外设置权限和向用户申请权限,如果安全控件可以满足我们的需求,建议直接使用安全控件的方式。

使用安全控件的主要流程如下:

https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/122/927/098/0300086000122927098.20250827085441.21172279204078510845894428117002:50001231000000:2800:BF7072C370310F57EBF47A46B3CEFD0A79F998CFE856144DA40D036FF0E1D126.png

1. 设置安全控件的基本样式

如果安全控件的基本样式不清晰、明了,那么系统就会拒绝授权给你保存图片,这个务必要注意。

安全控件的保存控件。用户点击保存控件,应用可以临时获取存储权限,而不需要权限弹框授权确认。

为避免控件样式不合法导致授权失败,请开发者先了解安全控件样式的约束与限制

可能会导致授权失败的问题(包括但不限于):

  • 字体、图标尺寸过小。
  • 安全控件整体尺寸过大。
  • 字体、图标、背景按钮的颜色透明度过高。
  • 字体或图标与背景按钮颜色过于相似。
  • 安全控件超出屏幕、超出窗口等,导致显示不全。
  • 安全控件被其他组件或窗口遮挡。
  • 安全控件的父组件有类似变形模糊等可能导致安全控件显示不完整的属性。
     SaveButton({

        text: SaveDescription.SAVE_IMAGE,

        icon: SaveIconStyle.FULL_FILLED

      })

https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/122/927/098/0300086000122927098.20250827085447.90805624908288582977258818557320:50001231000000:2800:C1D2B83BA98E6E7167CB9B57C3C89BB670190BA0ECD0197F13D7997B957EF3DA.png

2. 使用 phAccessHelper得到存图库中的路径

createAsset:指定文件类型、后缀和创建选项,创建图片或视频资源

      SaveButton({

        text: SaveDescription.SAVE_IMAGE,

        icon: SaveIconStyle.FULL_FILLED

      })

        .onClick(async (event, result: SaveButtonOnClickResult) => {

          if (result == SaveButtonOnClickResult.SUCCESS) {

            try { // 获取相册访问助手

              const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());

              // 创建图片资源

              const createOptions: photoAccessHelper.CreateOptions = {

                subtype: photoAccessHelper.PhotoSubtype.DEFAULT

              };

              const uri =

                await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, this.fileUrl.split('.').pop(),

                  createOptions)

            

            } catch (e) {

              console.log("保存失败", e.message)

            }

          }

        })

3. 读取要保存图片的源数据

这里需要传入Picker选择的图片的具体路径 this.fileUri

          // 4 开始选择图片

          photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {

            uris = photoSelectResult.photoUris

更多关于HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

更多关于HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢支持,

在HarmonyOS鸿蒙Next中,图片编辑功能通过Picker和PhotoView等组件实现图片选择。用户可通过系统提供的UI控件访问本地相册,选择图片后进入编辑界面。编辑完成后,使用MediaLibrary接口将处理后的图片保存至系统图库,文件路径遵循鸿蒙媒体存储规范。整个过程基于ArkTS和鸿蒙SDK实现,无需依赖Java或C语言。

在HarmonyOS应用开发中,使用PhotoViewPickerSaveButton是实现图片选择与保存的高效方式。PhotoViewPicker通过配置PhotoSelectOptions(如MIMETypemaxSelectNumber)允许用户从相册选择或拍照获取图片,返回URI供后续处理。SaveButton作为安全控件,简化了保存流程,无需显式权限申请,通过createAsset创建资源路径,结合fileIo模块读写数据完成保存。注意确保SaveButton样式符合规范以避免授权失败。这两个功能协同工作,为图片编辑类应用提供了流畅的用户体验。

回到顶部