Bootstrap

【HarmonyOS实战开发】鸿蒙使用媒体文件管理服务实现图片压缩

Media Library Kit 简介

Media Library Kit(媒体文件管理服务)提供了管理相册和媒体文件的能力,包括照片和视频,帮助你的应用快速构建图片视频展示和播放能力。
官方提供了很多API,此文仅涉及图库相册
使用媒体文件管理服务需要配置和申请权限

●在配置文件 module.json5 中声明权限。
●向用户申请授权。

相册管理模块的读写操作需要相应权限,在申请权限前,请保证符合权限使用的基本原则。

在这里插入图片描述

关于权限申请还有另一篇文可供参考 HarmonyOS权限管理

获取图片信息

应用通过调用 PhotoAccessHelper.getAssets 获取媒体资源。

前提条件

●申请相册管理模块读权限 ‘ohos.permission.READ_IMAGEVIDEO’。
●获取相册管理模块 photoAccessHelper 实例。
●导入 dataSharePredicates 模块。

// 获取图片
async getPhotos() {
  // 相册管理器
  const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
  // 相册数据库谓词(筛选条件)
  const predicates = new dataSharePredicates.DataSharePredicates()
  // 根据条件获取资源
  const fetchAssetsResult = await phAccessHelper.getAssets({
    fetchColumns: [],
    predicates: predicates
  })
  // 获取图片资源
  const photoAssets = await fetchAssetsResult.getFirstObject() // 获取第一张图片
}

PhotoKeys 图片/视频信息

枚举,图片和视频文件关键信息。
文档链接:docs.openharmony.cn/pages/v4.1/…

获取图片大小(图片信息)

1.在 fetchColumns 中添加属性字段
2.用 get 接口去获取属性,返回值为联合类型,通过 as 断言指定类型

// 获取图片
async getPhotos() {
  // 相册管理器
  const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
  // 相册数据库谓词(条件)
  const predicates = new dataSharePredicates.DataSharePredicates()
  // 根据条件获取资源
  const fetchAssetsResult = await phAccessHelper.getAssets({
    fetchColumns: [photoAccessHelper.PhotoKeys.SIZE],        // 1. 添加 SIZE 字段
    predicates: predicates
  })
  // 获取图片资源
  const photoAssets = await fetchAssetsResult.getFirstObject() // 获取第一个资源
  photoAssets.get(photoAccessHelper.PhotoKeys.SIZE) as number // 2. 获取 SIZE 属性
}

删除照片(放入回收站)

通过 MediaAssetChangeRequest.deleteAssets 可以将文件放入回收站。
实现步骤:

1.建立检索条件,用于获取图片资源。
2.调用 PhotoAccessHelper.getAssets 接口获取目标图片资源。
3.调用 getFirstObject / getAllObjects 接口获取图片,即要放入回收站的图片对象。
4.调用MediaAssetChangeRequest.deleteAssets接口将文件放入回收站。

// 删除图片
async deletePhotos() {
  // 1. 建立检索条件,用于获取图片资源。
  const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
  const predicates = new dataSharePredicates.DataSharePredicates()
  // 2. 调用 PhotoAccessHelper.getAssets 接口获取目标图片资源。
  const assets = await phAccessHelper.getAssets({
    fetchColumns: [],
    predicates
  })
  // 3. 获取第一张图片资源
  const photoAsset = await assets.getFirstObject()
  // 4. 删除图片的核心代码 deleteAssets,为准备第二个参数 photoAsset,前面需要做很多准备工作
  await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(getContext(), [photoAsset])
}

获取相册信息

docs.openharmony.cn/pages/v4.1/…

// 获取用户相册
async getUserAlbums() {
  // 通过 PhotoAccessHelper.getAlbums 接口获取相册
  const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
  // 获取相册对象
  const fetchResultAlbums = await phAccessHelper.getAlbums(
    photoAccessHelper.AlbumType.USER, // 一级相册类型(用户相册,系统相册)
    photoAccessHelper.AlbumSubtype.USER_GENERIC // 二级相册类型(用户相册,收藏夹)
  )
  // 获取所有相册
  const list = await fetchResultAlbums.getAllObjects()
  this.albumList = list
}

压缩图片

●创建ImagePacker实例:SystemCapability.Multimedia.Image.ImagePacker
●表示图片打包选项:SystemCapability.Multimedia.Image.ImagePacker
●图片源类,用于获取图片相关信息:SystemCapability.Multimedia.Image.ImageSource在调用ImageSource的方法前,需要先通过createImageSource构建一个ImageSource实例。
●关键API:packing(source: ImageSource, option: PackingOption): Promise 图片压缩或重新打包,使用Promise形式返回结果

// 压缩图片
async compressImage(uri: string, quality = 20) {
  // ---- 压缩图片 ----
  // 创建图片打包器
  const imagePacker = image.createImagePacker()
  // 坑点:createImageSource 不能直接使用 uri,需要先基于 uri 打开文件,再传入文件的 fd
  const file = fileIo.openSync(uri)
  // createImageSource 传入文件标识 fd,获取图片源
  const imageSource = image.createImageSource(file.fd)
  // 图片打包(图片重新编码)
  //  参数1: 图片源
  //  参数2: 打包配置:格式、质量 为必传参数
  const arrayBuffer = await imagePacker.packing(imageSource, { format: 'image/jpeg', quality: quality })
  // AlertDialog.show({ message: '压缩后文件流大小为:' + formatByteLength(arrayBuffer.byteLength) })
  // ---- 压缩图片 ----

  // ---- 写入图库 ----
  // 把数据流写入图库中,需要使用到 photoAccessHelper 模块
  const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
  // 创建图片资产,返回 uri 路径
  const createAssetUri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg')
  // 数据写入图库前,需要先打开图库文件 并 设置打开模式为 可写
  const createAssetFile = fileIo.openSync(createAssetUri, fileIo.OpenMode.READ_WRITE)
  // writeSync 把压缩后的图片数据流,写入到文件中
  fileIo.writeSync(createAssetFile.fd, arrayBuffer)
  // 数据写入完成,关闭文件,释放资源
  fileIo.close(createAssetFile.fd)
  // ---- 写入图库 ----
}

写在最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新5.0学习路线

在这里插入图片描述

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版5.0全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

在这里插入图片描述

《鸿蒙生态应用开发V3.0白皮书》

在这里插入图片描述

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

在这里插入图片描述

《鸿蒙开发基础》

●ArkTS语言
●安装DevEco Studio
●运用你的第一个ArkTS应用
●ArkUI声明式UI开发
.……
在这里插入图片描述

《鸿蒙开发进阶》

●Stage模型入门
●网络管理
●数据管理
●电话服务
●分布式应用开发
●通知与窗口管理
●多媒体技术
●安全技能
●任务管理
●WebGL
●国际化开发
●应用测试
●DFX面向未来设计
●鸿蒙系统移植和裁剪定制
……
在这里插入图片描述

《鸿蒙进阶实战》

●ArkTS实践
●UIAbility应用
●网络案例
……
在这里插入图片描述

获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

;