鸿蒙NEXT开发笔记(二十八)仿抖音快手App的把位图数据转存为图片

上一节我们利用Scroller实现了列表项的自动滚动功能,对于图像列表来说,被选做封面的图像需要保存为图片文件,以便向服务器上传封面图片。
由于avImageGenerator从视频提取的图像帧数据为image.PixelMap(位图格式),因此前面的图像转存操作就变成了把位图数据写入图片文件。那么根据沙箱文件的操作规范,可将完整的图片转存过程划分为下列三个步骤:

一、在沙箱目录下创建新文件并打开该文件

鸿蒙把文件操作能力封装到了Core File Kit(文件基础服务),并通过fileIo工具来调用文件操作函数。为此要在代码开头添加下面的导包语句,表示引入文件操作工具fileIo:

import { fileIo } from '@kit.CoreFileKit';

鸿蒙把创建文件和打开文件合并到了一起,调用open函数或者openSync函数,即可实现创建并打开文件的功能。注意,在调用open或者openSync的时候,模式参数要填“fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE”,表示指定路径若不存在文件就创建新文件,若已存在文件就打开原文件。示例代码如下:

let dstFile = fileIo.openSync(this.imagePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);

二、把位图数据打包写入第一步骤的新文件

鸿蒙把图片处理能力封装到了Image Kit(图片处理服务),并通过image工具来调用图片处理函数。image工具又包含下列常见的子工具:
(1)ImageSource类,提供获取图片信息、将图片解码为PixelMap或Picture、读取和修改图片属性的能力。支持解码的图片格式包括png、jpeg、bmp、gif、webp、dng、heic。
(2)ImagePacker类,提供将图片编码为压缩后的数据流或文件的能力。编码前需获取图片的ImageSource、PixelMap或Picture作为输入。支持编码的图片格式包括jpeg、webp、png、heic、gif。
(3)PixelMap类,位图对象,包含像素数据以及图片信息。可用于读取或写入像素数据,进行裁剪、缩放、平移、旋转、镜像等操作,并可直接传给Image组件用于显示。
可见位图数据属于PixelMap类,而位图数据的转存功能则由ImagePacker类实现,调用image工具的createImagePacker方法,即可获得ImagePacker类的对象实例。接着调用ImagePacker实例的packToFile,即可将位图数据写入指定句柄的文件中。示例代码如下:

imagePackerApi.packToFile(this.pixelMap, dstFile.fd, packOpts, (err: BusinessError) => {/* 这里可补充位图转存完成之后的其他操作 */if (err) { /* 打印失败日志 */ } else { /* 打印成功日志 */ }
})

三、写入完毕,关闭第一步打开的图片文件

调用fileIo工具的close函数或者closeSync函数,即可实现关闭文件的功能。示例代码如下:

fileIo.closeSync(dstFile);

综合上述三个步骤,可编写位图数据转存为图片文件的代码框架如下所示:

// 保存封面图片
saveCover() {let videoFileName = this.videoPath.toString().split('/').pop() as stringlet imageFileName = (videoFileName.split('.'))[0] + '_' + this.coverPos + '.jpeg'this.imagePath = `${this.context.cacheDir}/${imageFileName}`let dstFile = fileIo.openSync(this.imagePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);// 转存为图片let imagePackerApi: image.ImagePacker = image.createImagePacker();let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 90 };imagePackerApi.packToFile(this.pixelMap, dstFile.fd, packOpts, (err: BusinessError) => {fileIo.closeSync(dstFile);if (err) { /* 打印失败日志 */ } else { /* 打印成功日志 */ }})
}

下一篇文章会介绍如何把相册中的视频复制到沙箱目录。

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

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

相关文章

四、搭建springCloudAlibaba2021.1版本分布式微服务-加入openFeign远程调用和sentinel流量控制

OpenFeign远程调用 1、OpenFeign OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问…

网络安全威胁——APT攻击_apt攻击预测案例

APT攻击 1. 基本概念2. APT的攻击阶段3. APT的典型案例参考 1. 基本概念 高级持续性威胁(APT,Advanced Persistent Threat),又叫高级长期威胁,是一种复杂的、持续的网络攻击,包含高级、长期、威胁三个要…

顺时针旋转N * N 的矩阵

顺时针旋转题目描述数据范围实现逻辑代码实现题目描述 有一个NxN整数矩阵&#xff0c;请编写一个算法&#xff0c;将矩阵顺时针旋转90度。给定一个NxN的矩阵&#xff0c;和矩阵的阶数N,请返回旋转后的NxN矩阵。数据范围 0<n<300&#xff0c;矩阵中的值满足 0≤val≤100…

原生C++实现信号与槽机制:原理详解

信号与槽机制是一种广泛应用于事件驱动系统和GUI框架&#xff08;如Qt&#xff09;的设计模式。它允许组件之间通过订阅-发布模式进行通信&#xff0c;从而实现松耦合的设计。本文将详细讲解如何在原生C中从零开始实现信号与槽机制&#xff0c;并深入探讨其工作原理。一、信号与…

【人工智能】OpenAI的AI代理革命:通向超拟人交互的未来之路

人工智能代理(AI Agent)正引领一场深刻的技术变革,其核心在于赋予AI系统感知、规划、行动和学习的能力,以自主完成复杂任务。OpenAI作为这一领域的先驱,通过其大型语言模型(LLMs)如GPT系列,极大地推动了AI代理的发展,使其在自然语言理解、生成和工具使用方面达到了前所…

Ubuntu虚拟机介绍、命令、安装软件指令(一)

Ubuntu介绍 Ubuntu 是一个基于 Debian 的开源 Linux 操作系统&#xff0c;由 Canonical 公司赞助开发。它是目前全球最流行的 Linux 发行版之一&#xff0c;以其用户友好性、稳定性和强大的社区支持著称。 核心特性 1.免费开源 完全免费使用和分发&#xff0c;遵循 GNU GPL…

企业微信服务商创建第三方应用配置数据回调url和指令回调url的java代码实现

关键区别说明&#xff08;指令回调 vs 数据回调&#xff09;特性指令回调数据回调触发场景授权/取消授权等管理事件通讯录变更、应用菜单点击等业务事件关键字段InfoTypeEvent ChangeType典型事件suite_auth, cancel_authchange_contact, suite_ticket响应要求必须返回加密的&…

LazyLLM教程 | 第2讲:10分钟上手一个最小可用RAG系统

贴心小梗概本文将介绍使用LazyLLM搭建最基础的RAG的流程。首先介绍使用LazyLLM搭建RAG系统的必要环境配置&#xff0c;然后简单回顾RAG的基本流程&#xff0c;接下来分别介绍RAG中文档加载、检索组件、生成组件三个关键部分的参数和基本使用方法&#xff0c;最后利用LazyLLM实现…

android9-PMS-常见问题及分析步骤

以下是基于 Android 9 的 Package Manager Service (PMS) 常见问题及分析步骤&#xff0c;结合系统原理与优化实践整理&#xff1a; &#x1f527; 一、开机性能问题 现象 开机时间随应用增多显著延长&#xff0c;卡在“正在启动应用”阶段。 分析步骤 ① 确认扫描阶段耗时adb…

生成模型实战 | GLOW详解与实现

生成模型实战 | GLOW详解与实现0. 前言1. 归一化流模型1.1 归一化流与变换公式1.2 RealNVP 的通道翻转2. GLOW 架构2.1 ActNorm2.2 可逆 11 卷积2.3 仿射耦合层2.4 多尺度架构3. 使用 PyTorch 实现 GLOW3.1 数据处理3.2 模型构建3.3 模型训练0. 前言 GLOW (Generative Flow) 是…

行业案例:杰和科技为智慧教育构建数字化硬件底座

清晨8点10分&#xff0c;深圳某学生踏入校园&#xff0c;智慧门闸识别身份&#xff0c;并同步发给家长&#xff1b;走廊里的“智慧班牌”向他们展示今日的课表&#xff1b;课堂上&#xff0c;教室前方的多媒体播放器里&#xff0c;老师引导学生学习“居民楼消防隐患”知识&…

Redis与MySQL数据同步:从“双写一致性”到实战方案

Redis与MySQL数据同步&#xff1a;从“双写一致性”到实战方案 在分布式系统中&#xff0c;Redis作为高性能缓存被广泛使用——它能将热点数据从MySQL中“搬运”到内存&#xff0c;大幅降低数据库压力、提升接口响应速度。但随之而来的核心问题是&#xff1a;当MySQL数据更新时…

Java源码构建智能名片小程序

在移动互联网时代&#xff0c;纸质名片的局限性日益凸显——信息更新不便、客户管理困难、营销效果难以追踪。智能电子名片小程序以其便捷、高效、智能的特点&#xff0c;正成为商务人士的"数字营销门户"。而基于Java技术栈开发的智能名片系统&#xff0c;凭借其稳定…

如何在短时间内显著提升3D效果图渲染速度?

在建筑设计、游戏开发、影视制作等行业&#xff0c;3D效果图的渲染速度是项目进度与效率的关键瓶颈。面对复杂场景时&#xff0c;漫长的渲染等待尤为突出。要在保证质量的前提下大幅缩短渲染时间&#xff0c;以下优化策略至关重要&#xff1a; 1. 升级硬件配置&#xff1a;渲染…

配置daemon.json使得 Docker 容器能够使用服务器GPU【验证成功】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 文章目录&#x1f50d;你遇到的错误&#xff1a;&#x1f50d; 根本原因✅ 解决方案&#xff1a;正确安装 NVIDIA Container Toolkit✅ 第一步&#xff1a;卸载旧版本&#xff08;如果存在&…

Linux 系统进程管理与计划任务详解

Linux 系统进程管理与计划任务详解 一、程序与进程的基本概念 程序&#xff1a;保存在外部存储介质中的可执行机器代码和数据的静态集合。进程&#xff1a;在CPU及内存中处于动态执行状态的计算机程序。关系&#xff1a;每个程序启动后&#xff0c;可创建一个或多个进程。 二、…

【图像处理】直方图均衡化c++实现

直方图均衡化是一种通过调整图像像素灰度值分布&#xff0c;来增强图像对比度的经典数字图像处理技术。其核心在于将原始图像的灰度直方图从集中的某个区间“拉伸”或“均衡”到更广泛的区间&#xff0c;让图像的明暗细节更清晰&#xff0c;关键在于利用累积分布函数实现灰度值…

Web前端实战:Vue工程化+ElementPlus

1.Vue工程化 1.1介绍 模块化&#xff1a;将js和css等&#xff0c;做成一个个可复用模块组件化&#xff1a;我们将UI组件&#xff0c;css样式&#xff0c;js行为封装成一个个的组件&#xff0c;便于管理规范化&#xff1a;我们提供一套标准的规范的目录接口和编码规范&#xff0…

ECMAScript2021(ES12)新特性

概述 ECMAScript2021于2021年6月正式发布&#xff0c; 本文会介绍ECMAScript2021(ES12)&#xff0c;即ECMAScript的第12个版本的新特性。 以下摘自官网&#xff1a;ecma-262 ECMAScript 2021, the 12th edition, introduced the replaceAll method for Strings; Promise.any,…

Tlias 案例-整体布局(前端)

开发流程前端开发和后端开发是一样的&#xff0c;都需要阅读接口文档。 准备工作&#xff1a; 1&#xff1a;导入项目中准备的基础过程到 VsCode。2&#xff1a;启动前端项目&#xff0c;访问该项目3&#xff1a;熟悉一下基本的布局<script setup></script><tem…