HarmonyOS:如何将图片转为PixelMap并进行图片缓存策略

前言:在HarmonyOS项目开发中,我们使用Ark-Ts语言开发项目。我们有个功能是拍照,除了正常显示出来,并且上传服务器。我在开发过程中,遇到的问题是,如果离开这个页面再回到当前页面仍要显示图片,那我的思路就是存储在沙盒,重新回到这个页面先去沙盒里面查找照片,如果找到就显示出来。

流程图:

请添加图片描述

1.模拟拍照:
模拟拍照方法
takePhoto(){let pixelMap1 = await SnapshotUtil.snapshot()//添加水印信息(此处省略)//调用步骤2.//照片存储到本地,并返回路径let filePath:string = await WinPixelImageTool.asyncSavePixelImageToFileCache(waterMarkPixelMap);//存储照片存储沙盒路径let imageKey = '自定义key值'PreferencesManager.set(imageKey,filePath);}
/*** 获取窗口截图,使用Promise异步回调。* @param windowClass 不传默认截图主窗口* @returns*/static async snapshot(windowClass?: window.Window): Promise<image.PixelMap> {return (windowClass ?? AppUtil.getMainWindow()).snapshot();}
2.生成图片存储路径
static asyncSavePixelImageToFileCache(pixelIamge:PixelMap){return new Promise<string>((resolve)=>{const imagePackerApi: image.ImagePacker = image.createImagePacker();let packOpts : image.PackingOption = { format:"image/png", quality:100 };const context : Context = AppUtil.getContext();let fileName = DateUtil.getTodayTime().toString();let path : string = context.cacheDir + `/sfa`;if (!FileUtil.accessSync(path)) {FileUtil.mkdirSync(path)}path = `${path}/pixel_map_${fileName}.png`let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);imagePackerApi.packToFile(pixelIamge, file.fd, packOpts,(error: BusinessError): void => {if (error) {resolve('')}else {// let fileUriPath = fileUri.getUriFromPath(path);resolve(path)}})})}

//存储方法

static set(key: string, value: dataPreferences.ValueType) {if (context==undefined) {context = AppUtil.getContext()}let preferences = dataPreferences.getPreferencesSync(context, { name: preferencesName });preferences?.putSync(key, value);preferences?.flush();}
3.如何将图片转为PixelMap并且显示出来,方法如下:

/*

  • 沙盒目录下的照片转为image.PixelMap
  • imageId是存储照片沙盒路径的key
  • localImagePath 是照片的存储沙盒路径
    */
//通过Imagekey获取图片,比如门头照显示就是此方法static getImageByImageId(imageId:string):Promise<image.PixelMap> {return new Promise<image.PixelMap>(async (resolve,reject) => {let localImagePath =  PreferencesManager.get(imageId) as string;if (localImagePath&&localImagePath.length>0) {let tmpImagePixelMap =  await WinImagePixelMapUtils.getImagePixelMapWithFilePath(localImagePath);resolve(tmpImagePixelMap.pixelMap);}else {reject();}})}//WinImagePixelMapUtils类
static async getImagePixelMapWithFilePath(filePath:string){let imageSource = image.createImageSource(filePath);return await imageSource2PixelMap(imageSource);}export  async function imageSource2PixelMap(imageSource: image.ImageSource): Promise<ImagePixelMap> {const imageInfo: image.ImageInfo = await imageSource.getImageInfo();const height = imageInfo.size.height;const width = imageInfo.size.width;const options: image.DecodingOptions = {editable: true,desiredSize: { height, width }};const pixelMap: PixelMap = await imageSource.createPixelMap(options);const result: ImagePixelMap = { pixelMap, width, height };return result;
}

getImageByImageId
通过此方法找到沙盒里面的图片,
使用Image组件可以直接加载tmpImagePixelMap.pixelMap

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

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

相关文章

ctf网络安全比赛有一张图片怎么查看

0102-JavaScript简介&&作用 02简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 03作用 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语…

搭建一个简单的node服务,模拟后端接口

目录 一、查看是否安装了node和npm 二、创建一个文件夹&#xff0c;用于放你的node服务代码 三、初始化一个package.json 四、安装 Express&#xff08;快速搭建服务的框架&#xff09; 五、创建serve.js 六、运行服务即可 七、测试接口 法一&#xff1a;使用 curl 法…

【五.LangChain技术与应用】【31.LangChain ReAct Agent:反应式智能代理的实现】

一、ReAct Agent是啥?为什么说它比「普通AI」聪明? 想象一下,你让ChatGPT查快递物流,它可能直接编个假单号糊弄你。但换成ReAct Agent,它会先推理(Reasoning)需要调用哪个接口,再行动(Action)查询真实数据——这就是ReAct的核心:让AI学会「动脑子」再动手。 举个真…

BUUCTF逆向刷题笔记(1-12)

easyre、内涵的软件、xor、不一样的flag&#xff1a; buuctf reverse部分题解&#xff08;实时更新&#xff09;_reverse 题解-CSDN博客 请见小库里的blog。 reverse1 查壳发现没有&#xff0c;而且是64位 粗略改一下部分函数名&#xff0c;看看主要逻辑。 第一个for循环暂…

OceanBase-obcp-v3考试资料梳理

集群架构 基本概念 集群: 集群由一个或多个Region组成,Region 由一个或多个Zone组成,Zone由一个或多个OBServer组成,每个OBServer里有若干个partition的Replica。 Region: 对应物理上的一个城市或地域,当OB集群由多个Region组成时, 数据库的数据和服务能力就具备地域…

【C++】双指针算法

我们还有更长的路要走&#xff0c;不过没关系&#xff0c;道路就是生活。 前言 这是我自己学习蓝桥杯算法的第一篇博客总结。后期我会继续把蓝桥杯算法学习笔记开源至博客上。 技巧 1. 双指针算法&#xff0c;但实际上是利用数组下标来充当指针&#xff0c;并不是直接使用指…

如何使用MyBatis进行多表查询

前言 在实际开发中&#xff0c;对数据库的操作通常会涉及多张表&#xff0c;MyBatis提供了关联映射&#xff0c;这些关联映射可以很好地处理表与表&#xff0c;对象与对象之间的的关联关系。 一对一查询 步骤&#xff1a; 先确定表的一对一关系确定好实体类&#xff0c;添加关…

江科大51单片机笔记【9】DS1302实时时钟(上)

一、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能。RTC&#xff08;Real Time Clock&#xff09;&#xff1a;实时时钟&#xff0c;是一种集成电路…

【Python项目】基于深度学习的车辆特征分析系统

【Python项目】基于深度学习的车辆特征分析系统 技术简介&#xff1a;采用Python技术、MySQL数据库、卷积神经网络&#xff08;CNN&#xff09;等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用…

汽车智能钥匙中PKE低频天线的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被动式无钥匙进入系统&#xff0c;汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用&#xff0c;以下是其具体作用&#xff1a; 信号交互与身份认证 低频信号接收&#xff1a;当车主靠近车辆时…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式&#xff0c;实现一般是通过SQL能直接生成数据API&#xff0c;同时能对产生的数据API进行全生命周期的管理&#xff0c;典型的SQL2API的实现模式。 以下是针对…

【CF】C. Tokitsukaze and Two Colorful Tapes+C. Where is the Pizza?

https://codeforces.com/contest/1677/problem/C https://codeforces.com/contest/1670/problem/C 两道很像的的题目&#xff0c;都和环有关 C. Tokitsukaze and Two Colorful Tapes 题目&#xff1a; 思路&#xff1a; 题意就是给定你两排颜色&#xff0c;要求在相同的颜色…

leetcode0020 - 有效的括号 easy

1 题目&#xff1a;有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须…

基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)

摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响&#xff0c;导致在真实临床环境中诊断不可靠。领域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通过多领域训练提升模型在未知领域的性能&#xff0c;但…

【STM32】玩转IIC之驱动MPU6050及姿态解算

目录 前言 一.MPU6050模块介绍 1.1MPU6050简介 1.2 MPU6050的引脚定义 1.3MPU6050寄存器解析 二.MPU6050驱动开发 2.1 配置寄存器 2.2对MPU6050寄存器进行读写 2.2.1 写入寄存器 2.2.2读取寄存器 2.3 初始化MPU6050 2.3.1 设置工作模式 2.3.2 配置采样率 2.3.3 启…

【C#】async与await介绍

1. 实例1 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();Method2();Console.ReadKey();}public static…

Gitlab配置personal access token

1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token &#xff0c;输入token名称&#xff0c;勾选权限&#xff08;注意截至日期 “Expiration date” 可不填&#xff09; 4. 创建成功后&#xff0c;显示token信息&#xff0c;复制到本地…

盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块

在当今科技飞速发展的时代&#xff0c;射频技术在众多领域发挥着关键作用&#xff0c;从通信、雷达系统到科研实验&#xff0c;对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍&#xff1a; SLMF315超低相位噪声0.2至15GHz频率综合…

Java 大视界 -- 基于 Java 的大数据分布式任务调度系统设计与实现(117)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

C++学习之路,从0到精通的征途:入门基础

目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 ​五.函数重载 1.参数个数不同 2.参数类型不…