HarmonyOS动态照片,简易环境助力高效开发

news/2025/9/23 17:56:29/文章来源:https://www.cnblogs.com/dBjZoQ833/p/19107651

头图
随着移动终端体验的不断提升,动态照片这种有趣味与表现力的内容形式,越来越受到用户的青睐。HarmonyOS允许用户在设备上查看和处理动态照片,这些照片不仅包含静态图像,还融合了视频片段,为用户提供更加丰富和生动的视觉体验。Media Library Kit媒体库提供动态照片的创建和管理能力,为开发者带来全新的开发场景和优化空间。

一、保存与播放动态照片
动态照片作为一种记录和分享生活瞬间的方式,广泛应用于各大社交软件中。用户通过拍摄动态照片,捕捉并分享那些稍纵即逝的美好时刻,并将浏览的精彩画面保存到本地。为了提升这一体验,Media Library Kit提供了完整的动态照片保存与播放的API接口。

1、使用安全控件保存动态照片
为支持应用保存动态照片资源,媒体库在MediaAssetChangeRequest类中提供了创建和保存动态照片的接口,应用可以灵活地将自己沙箱下的图片和视频资源保存至媒体库,涉及接口如下:

// 创建资产变更请求,需要在CreateOptions中指定subtype为动态照片
static createAssetRequest(context: Context, photoType: PhotoType, extension: string, options?: CreateOptions): MediaAssetChangeRequest;
// 通过fileUri从应用沙箱添加资源
addResource(type: ResourceType, fileUri: string): void;
// 通过ArrayBuffer添加资源
addResource(type: ResourceType, data: ArrayBuffer): void;
// 提交资产变更请求,在媒体库创建动态照片资产
applyChanges(mediaChangeRequest: MediaChangeRequest): Promise;
对没有读写权限的应用,HarmonyOS提供安全控件的方式保存媒体资源,应用可以临时获取媒体库存储权限,整个保存流程更简易。下面是使用安全控件保存动态照片的示例:

// 设置安全控件按钮属性
saveButtonOptions: SaveButtonOptions = {
icon: SaveIconStyle.FULL_FILLED,
text: SaveDescription.SAVE_IMAGE,
buttonType: ButtonType.Capsule
}
// 创建安全控件按钮
SaveButton(this.saveButtonOptions)
.onClick(async (event, result: SaveButtonOnClickResult) => {
if (result == SaveButtonOnClickResult.SUCCESS) {
let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
// 创建资产变更请求,subtype类型为动态照片
let changeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(
context, photoAccessHelper.PhotoType.IMAGE, "jpg", {
title: 'moving_photo',
subtype: photoAccessHelper.PhotoSubtype.MOVING_PHOTO
});
// 添加要保存的文件uri,文件资源位于应用沙箱
let imageUri = 'file://com.example.myapplication/data/storage/el2/base/haps/entry/files/mov_1.jpg';
let videoUri = 'file://com.example.myapplication/data/storage/el2/base/haps/entry/files/mov_1.mp4';
changeRequest.addResource(photoAccessHelper.ResourceType.IMAGE_RESOURCE, imageUri);
changeRequest.addResource(photoAccessHelper.ResourceType.VIDEO_RESOURCE, videoUri);
// 提交资产变更请求
await phAccessHelper.applyChanges(changeRequest);
}
})
2、访问和播放动态照片
媒体库为应用提供了统一的动态照片访问接口requestMovingPhoto和MovingPhoto对象,支持应用读取动态照片。同时,MovingPhotoView组件用于播放动态照片,为用户提供沉浸、流畅的动图体验。
1、MediaAssetManager-requestMovingPhoto接口:支持读取动态照片对象。
2、MovingPhoto对象:支持读取动态照片的图片和视频内容。
3、MovingPhotoViewController:控制动态照片的播放状态(如播放、停止)。

动态照片的图片部分由HarmonyOS分段式拍照统一出图,因此requestMovingPhoto接口支持按照不同图片模式请求读取动态照片对象。

// 根据不同的requestOptions模式,请求动态照片对象
requestMovingPhoto(context: Context, asset: PhotoAsset, requestOptions: RequestOptions, dataHandler: MediaAssetDataHandler): Promise
应用通过配置接口参数RequestOptions . DeliveryMode就能实现以下三种请求:
1、快速模式(DeliveryMode.FAST_MODE):立刻为应用返回当前准备好的图片。
2、高质量模式(DeliveryMode. HIGH_QUALITY_MODE):向应用返回全质量图。若未生成,媒体库会主动触发底层生成二阶段图片任务,并为应用返回全质量图片。
3、均衡模式(DeliveryMode. BALANCE_MODE):若全质量图已经生成,则直接返回给应用。否则,先向应用返回低质量图,然后触发二阶段任务,待全质量图片生成后再次返回。

// 创建动态照片处理器,当请求的资源准备完成时触发回调
class MovingPhotoHandler implements photoAccessHelper.MediaAssetDataHandler<photoAccessHelper.MovingPhoto> {
async onDataPrepared(movingPhoto: photoAccessHelper.MovingPhoto) {
if (movingPhoto === undefined) {
console.error('Error occurred when preparing data');
return;
}
console.info("moving photo acquired successfully, uri: " + movingPhoto.getUri());
}
}
// 从媒体库中读取动态照片asset
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo(photoAccessHelper.PhotoKeys.PHOTO_SUBTYPE, photoAccessHelper.PhotoSubtype.MOVING_PHOTO);
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: [],
predicates: predicates
};
let assetResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
let asset: photoAccessHelper.PhotoAsset = await assetResult.getFirstObject();
// 以FAST_MODE模式为例,请求动态照片对象
let requestOptions: photoAccessHelper.RequestOptions = { deliveryMode: photoAccessHelper.DeliveryMode.FAST_MODE, }
const handler = new MovingPhotoHandler();
try {
let requestId: string = await photoAccessHelper.MediaAssetManager.requestMovingPhoto(context, asset, requestOptions, handler);
console.info("moving photo requested successfully, requestId: " + requestId);
} catch (err) {
console.error(failed to request moving photo, error code is ${err.code}, message is ${err.message});
}
获取到MovingPhoto对象后,开发者可以利用ArkTS组件播放动态照片。HarmonyOS提供MovingPhotoView组件展示动态照片,其参数MovingPhotoViewOptions可供应用选择播放动态照片的数据源(MovingPhoto对象)和播放控制器(MovingPhotoViewController)。

MovingPhotoView(options: MovingPhotoViewOptions) // 动态照片组件
控制器用来控制动态照片的播放状态,当前可使用的状态有如下三种:
1、startPlayback():开始播放动态照片。
2、stopPlayback():停止播放,再次播放时从头开始。
3、refreshMovingPhoto():强制刷新动态照片组件加载的视频和图片资源。

Media Library Kit提供了多种形式播放动态照片的示例,请参考API指南使用MovingPhotoView组件。

二、拍摄并保存动态照片
大多社交软件都为用户提供拍摄动态照片功能,方便用户随时查看和分享图片。HarmonyOS动态照片的拍摄采用分段式拍照统一出图流程,旨在让相机类应用的用户体验与系统相机一致,通过统一拍照流程提升拍照体验。在拍照过程中,相机应用的参与流程被减弱,所有操作均由底层框架进行,MediaLibrary Kit参与动态照片拍摄的具体流程图如下:

image.png

流程1

一阶段动态照片拍摄时,相机应用向相机框架下发拍摄命令,相机框架将命令传递给HAL层。相机HAL抓取两路流(图片流和视频流)并传递至相机框架。图片流由相机框架传递给媒体库,保存为一阶段80分图片。相机框架完成动态照片视频编码后,将视频传递给媒体库保存。

流程2

相机应用通过saveCameraPhoto接口保存动图,并传递用户拍摄时选择的水印和滤镜数据。媒体库接收到保存命令和编辑数据后,将原始图片、原始视频和编辑数据通过编创框架和视频编辑生成效果动态照片。

流程3

媒体库将二段式任务传递给相机框架,相机框架根据系统资源情况适时触发。二阶段图片生成后,媒体库使用100分图片替换一阶段的80分图片,并进行效果图和缩略图的刷新。在图库和三方应用访问新拍摄动态照片的场景中,媒体库会高优先级触发动态照片的二段式任务。当底层完成二段式照片的生成后,媒体库对一阶段图片进行替换,并根据编辑数据生成新的效果图。

媒体库为开发者提供saveCameraPhoto接口保存拍摄的动态照片,应用通过监听动态照片拍照输出流状态,在回调函数中保存图片。

// asset由监听动态照片输出流获得
async function example(asset: photoAccessHelper.PhotoAsset, context: Context) {
try {
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(asset);
assetChangeRequest.saveCameraPhoto();
// 提交保存请求
await phAccessHelper.applyChanges(assetChangeRequest);
console.info('apply saveCameraPhoto successfully');
} catch (err) {
console.error(apply saveCameraPhoto failed with error: ${err.code}, ${err.message});
}
}
更多案例:
https://github.com/sfasx120/sd/issues/1452
https://github.com/sfasx120/sd/issues/1451
https://github.com/sfasx120/sd/issues/1450
https://github.com/sfasx120/sd/issues/1449
https://github.com/sfasx120/sd/issues/1448
https://github.com/sfasx120/sd/issues/1447
https://github.com/sfasx120/sd/issues/1446
https://github.com/sfasx120/sd/issues/1445
https://github.com/sfasx120/sd/issues/1444

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计师逛的网站原神是哪家公司开发的

开头请记住一句话&#xff1a;复用针对资源&#xff0c;多址针对用户。 一、复用 1、复用是指一个信道传输多个信号&#xff0c;以提高资源利用率&#xff0c;针对的是信道资源。相当于高速公路上的车道&#xff0c;车道越多&#xff0c;传输速率越快&#xff0c;资源利用率也越…

网站js聊天代码如何把网站做成软件

目录 一、常见的发布方式 二、详解kubectl陈述式方式做灰度发布&#xff08;金丝雀发布&#xff09; 步骤一&#xff1a;先基于deployment控制器创建pod&#xff0c;然后发布 步骤二&#xff1a;基于命令行灰度发布 步骤三&#xff1a;测试等到版本稳定以后&#xff0c;再完…

怎么做属于自己的领券网站cnzz网站排名是怎么做的

题目 页面如下 页面长得像sql注入 点击help看一下 这里需要了解java web目录结构 WEB INF:Java的web应用安全目录&#xff1b; 此外如果想在页面访问WEB-INF应用里面的文件&#xff0c;必须要通过web.xml进行相应的映射才能访问&#xff1b; WEB-INF是Java Web应用程序中的一…

企业网站相关案例php自己写框架做网站6

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

印刷东莞网站建设技术支持做甜品台的网站

在营销落地页中&#xff0c;问卷类H5是一种制作简单&#xff0c;易于传播的落地页&#xff0c;通过精巧的设计和严密的逻辑设置&#xff0c;问卷类H5的投放效果也是不容小觑的。 问卷类H5在制作中有以下不可缺少的要素&#xff1a; 清晰的标题和简要的说明 标题应该简明扼要地…

淄博网站优化推广羽毛球赛事策划方案

基于云计算技术的B/S架构的HIS系统&#xff0c;为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。 系统利用云计算平台的技术优势&#xff0c;建立统一的云HIS、云病历、云LIS&#xff0…

龙岩城乡建设局网站商务网站建设教学视频教程

当磁盘大小超过标准时会有报警提示&#xff0c;这时如果掌握df和du命令是非常明智的选择。 df可以查看一级文件夹大小、使用比例、档案系统及其挂入点&#xff0c;但对文件却无能为力。 du可以查看文件及文件夹的大小。 两者配合使用&#xff0c;非常有效。比如用df查看哪个…

IT项目管理主要做什么?-ManageEngine卓豪

IT项目管理是管理IT项目从规划阶段到执行和部署阶段的过程,目的是实现将本地工具迁移到云、构建新功能或为企业构建知识库等目标。IT项目管理通常涉及利用可用资源来解决持续存在的问题,加强某些程序,甚至向IT基础设…

9.22学习笔记

虚拟机网络 NAT:宿主机做 NAT,客户机可出外网,宿主机→客户机需端口转发。 桥接:客户机直接拿到局域网独立 IP,方便同网段其他物理机访问。 Host-Only:与宿主机私网通信,无外网,最安全。 Hadoop 伪分布式核心配…

可以免费进的服务器网站做外汇看哪些网站

关于奇偶校验 奇校验(Odd Parity)&#xff1a;所有传送的数位&#xff08;含字符的各数位和校验位&#xff09;中&#xff0c;“1”的个数为奇数&#xff0c;如&#xff1a; 1 0110&#xff0c;0101 0 0110&#xff0c;0101 偶校验(Even Parity)&#xff1a;所有传送的数位&am…

wordpress站点标题副标题换行wordpress zendesk

Every day a Leetcode 题目来源&#xff1a;199. 二叉树的右视图 解法1&#xff1a;层序遍历 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 按层序遍历&#xff0c;将每层的…

搭建手机网站注册城乡规划师考试大纲

埃里克埃文斯&#xff08;Eric Evans&#xff09;已制定了什么是域驱动设计&#xff08;DDD&#xff09;。 Martin Fowler是DDD的大力支持者和拥护者。 这些都是非凡的名字&#xff0c;几乎可以肯定的是&#xff0c;他们正在支持一些有价值的东西。 我不是在这里对此争论。 也许…

2小时wordpress建站租整套房做民宿的网站

Java中所有类的对象都可以直接使用Object类中提供的一些方法 1. toString()&#xff1a;返回对象的字符串表示形式&#xff0c;通常在类中重写&#xff0c;以便于返回的是对象的内容 2. equals()&#xff1a;判断两个对象的地址是否相等&#xff0c;直接使用也一样&#xff0c;…

做cpa用什么类型的网站好国内新闻最近新闻今天

[1&#xff0e;GIS的概念 1&#xff0e;1什么是gis 地理信息系统 (GIS, Geographic Information System) 是一种基于计算机的工具&#xff0c;它可以对在地球上存在的东西和发生的事件进行成图和分析。 GI上次提到了EclipseTomcatLomboz Java Web开发环境的配置&#xff0c;可环…

长沙市建设工程质量安全监督站官方网站网站做前端

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JVM 本文章简介:话不多说,让我们讲清楚JVM当中的操作数在栈以及分析操作数…

胶州市网站建设seo 哪些媒体网站可以发新闻

目录 dijkstra算法求最短距离步骤 朴素的dijkstra算法---acwing-849 代码如下 代码思路 堆优化版的dijkstra算法---acwing-850 代码如下 关于最短路问题分有好几种类型 &#xff1a; 单源就是指&#xff1a;只求从一个顶点到其他各顶点 多源是指&#xff1a;要求每个顶…

实用指南:详解RabbitMQ高级特性之延迟插件的安装和使用

实用指南:详解RabbitMQ高级特性之延迟插件的安装和使用2025-09-23 17:44 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

Django 视图层

目录视图函数HttpRequest对象常用属性:常用方法:HttpResponse对象 参考文档:https://zhuanlan.zhihu.com/p/151368045 视图函数 视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请…

科技 公司 响应式 网站知名广州网站建设

前言 阅读本文需要阅读一些前置知识 [信号与系统]傅里叶变换、卷积定理、和为什么时域的卷积等于频域相乘。 [信号与系统]有关滤波器的一些知识背景 [信号与系统]关于LTI系统的转换方程、拉普拉斯变换和z变换 [信号与系统]关于双线性变换 IIR滤波器的数学表达式 IIR&…

第二部分:VTK核心类详解(第38章 vtkPointData点数据类) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …