HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库
HarmonyOS 鸿蒙Next可可图片编辑中选择图片和保存到图库
可可图片编辑 HarmonyOS(2) 选择图片和保存到图库
前言
HarmonyOS 上架应用 可可图片编辑 APP中,大量使用到了读取相册图片和保存图片到图库的功能。这篇文章主要围绕这两个核心功能继续讲解,目前HarmonyOS 应用开发中 主要推荐使用Picker读取媒体库的图片与视频。使用保存控件/授权弹窗保存媒体库的图片与视频。
picker 选择图片
Picker 可以实现直接选择图库图片或者拍照的方式获取图片,需要注意的是 使用 Picker 读取图片时,返回的该图片的uri信息。Picker读取图片。
1. 导入模块 photoAccessHelper 模块
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
photoAccessHelper 来自于 MediaLibraryKit,MediaLibraryKit(媒体文件管理服务)提供了管理相册和媒体文件的能力,包括图片和视频,帮助应用快速构建图片和视频的展示与播放功能。
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开始,该接口支持在元服务中使用。 |
以下示例代码中主要使用了 MIMEType 和 maxSelectNumber
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 安全控件 保存图片
应用可以通过安全控件或授权弹窗的方式,将用户指定的媒体资源保存到图库中。授权弹窗的方式需要另外设置权限和向用户申请权限,如果安全控件可以满足我们的需求,建议直接使用安全控件的方式。
使用安全控件的主要流程如下:
1. 设置安全控件的基本样式
如果安全控件的基本样式不清晰、明了,那么系统就会拒绝授权给你保存图片,这个务必要注意。
安全控件的保存控件。用户点击保存控件,应用可以临时获取存储权限,而不需要权限弹框授权确认。
为避免控件样式不合法导致授权失败,请开发者先了解安全控件样式的约束与限制。
可能会导致授权失败的问题(包括但不限于):
- 字体、图标尺寸过小。
- 安全控件整体尺寸过大。
- 字体、图标、背景按钮的颜色透明度过高。
- 字体或图标与背景按钮颜色过于相似。
- 安全控件超出屏幕、超出窗口等,导致显示不全。
- 安全控件被其他组件或窗口遮挡。
- 安全控件的父组件有类似变形模糊等可能导致安全控件显示不完整的属性。
SaveButton({
text: SaveDescription.SAVE_IMAGE,
icon: SaveIconStyle.FULL_FILLED
})
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
感谢支持,
在HarmonyOS鸿蒙Next中,图片编辑功能通过Picker和PhotoView等组件实现图片选择。用户可通过系统提供的UI控件访问本地相册,选择图片后进入编辑界面。编辑完成后,使用MediaLibrary接口将处理后的图片保存至系统图库,文件路径遵循鸿蒙媒体存储规范。整个过程基于ArkTS和鸿蒙SDK实现,无需依赖Java或C语言。
在HarmonyOS应用开发中,使用PhotoViewPicker
和SaveButton
是实现图片选择与保存的高效方式。PhotoViewPicker
通过配置PhotoSelectOptions
(如MIMEType
和maxSelectNumber
)允许用户从相册选择或拍照获取图片,返回URI供后续处理。SaveButton
作为安全控件,简化了保存流程,无需显式权限申请,通过createAsset
创建资源路径,结合fileIo
模块读写数据完成保存。注意确保SaveButton
样式符合规范以避免授权失败。这两个功能协同工作,为图片编辑类应用提供了流畅的用户体验。