HarmonyOS Next 保存图片数据到系统文件

news/2025/3/20 14:37:48/文章来源:https://www.cnblogs.com/oneDropWater/p/18782979

在鸿蒙应用开发中,保存图片数据到系统相册通常需要申请 basic 权限。然而,某些应用可能不希望申请额外的权限,或者没有充分的理由申请 basic 权限。在这种情况下,开发者可以选择将图片数据保存到系统文件中,而不是直接保存到相册。本文将详细介绍如何在鸿蒙开发中实现这一功能,包括图片数据的压缩处理、文件命名、保存路径选择以及文件写入操作。


1. 图片数据的压缩处理

在保存图片之前,通常需要对图片数据进行压缩处理,以减少文件大小并优化存储空间。鸿蒙系统提供了 image.ImagePacker 类,可以方便地对图片数据进行压缩。

以下是一个图片压缩的示例代码:

let bitmap: ArrayBuffer; // 图片数据
let packer: image.ImagePacker = image.createImagePacker();
let packerData = await packer.packing(bitmap, {format: 'image/jpeg', // 图片格式quality: 90 // 图片质量(0-100)
});

在这个示例中,bitmap 是原始的图片数据,packer.packing 方法将图片数据压缩为 JPEG 格式,并设置图片质量为 90。


2. 生成唯一的文件名称

为了避免文件重名,我们可以根据当前时间生成一个唯一的文件名称。以下是一个生成文件名称的示例代码:

let date = new Date();
let year: string = date.getFullYear().toString();
let month: string = this.addSpaceZero(date.getMonth() + 1);
let day: string = this.addSpaceZero(date.getDate());
let hours: string = this.addSpaceZero(date.getHours());
let minutes: string = this.addSpaceZero(date.getMinutes());
let seconds: string = this.addSpaceZero(date.getSeconds());
let imageTitle: string = 'IMG_' + year + month + day + '_' + hours + minutes + seconds + '.jpg';
hilog.info(0x0000, `saveQRNew imageTitle: ${imageTitle}`, '%{public}s');// 补零函数
addSpaceZero(timeNum: number): string {return timeNum < 10 ? '0' + timeNum.toString() : timeNum.toString();
}

在这个示例中,imageTitle 是根据当前时间生成的唯一文件名,格式为 IMG_YYYYMMDD_HHMMSS.jpg


3. 保存图片到系统文件

鸿蒙系统提供了 picker.PhotoSaveOptionspicker.PhotoViewPicker 类,用于选择保存路径并将图片数据写入文件。以下是一个保存图片的示例代码:

// 图片保存时的选项设置
let photoSaveOptions = new picker.PhotoSaveOptions();
photoSaveOptions.newFileNames = [imageTitle]; // 设置文件名// 获取上下文并创建 PhotoViewPicker 实例
let abilityContext = getContext() as common.UIAbilityContext;
let photoPicker = new picker.PhotoViewPicker(abilityContext);// 保存图片
photoPicker.save(photoSaveOptions).then((photoSaveResult: Array<string>) => {hilog.info(0x0000, `photoPicker save success, uri: ${JSON.stringify(photoSaveResult)}`, '%{public}s');let uri: string = photoSaveResult[0] || '';// 将图片数据写入文件let file = fs.openSync(uri, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE);fs.writeSync(file.fd, packerData);fs.closeSync(file.fd);
}).catch((err: BusinessError) => {hilog.info(0x0000, `photoPicker save fail, err: ${JSON.stringify(err)}`, '%{public}s');
});

在这个示例中:

  1. photoSaveOptions 用于设置保存文件的名称。
  2. photoPicker.save 方法用于选择保存路径并返回文件的 URI。
  3. fs.openSyncfs.writeSync 用于将压缩后的图片数据写入文件。

4. 注意事项

在实际开发中,需要注意以下几点:

(1)文件路径的合法性

确保生成的 URI 是合法的文件路径,避免写入失败。

(2)错误处理

在文件操作过程中,可能会遇到各种错误(如权限不足、存储空间不足等),需要捕获并处理这些错误。

(3)性能优化

如果图片数据较大,建议使用异步方式写入文件,避免阻塞主线程。


5. 完整代码示例

以下是一个完整的代码示例,包括图片压缩、文件命名和保存操作:

import image from '@ohos.multimedia.image';
import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';async function saveImageToFile(bitmap: ArrayBuffer) {// 图片压缩let packer: image.ImagePacker = image.createImagePacker();let packerData = await packer.packing(bitmap, {format: 'image/jpeg',quality: 90});// 生成文件名let date = new Date();let year: string = date.getFullYear().toString();let month: string = addSpaceZero(date.getMonth() + 1);let day: string = addSpaceZero(date.getDate());let hours: string = addSpaceZero(date.getHours());let minutes: string = addSpaceZero(date.getMinutes());let seconds: string = addSpaceZero(date.getSeconds());let imageTitle: string = 'IMG_' + year + month + day + '_' + hours + minutes + seconds + '.jpg';hilog.info(0x0000, `saveQRNew imageTitle: ${imageTitle}`, '%{public}s');// 保存图片let photoSaveOptions = new picker.PhotoSaveOptions();photoSaveOptions.newFileNames = [imageTitle];let abilityContext = getContext() as common.UIAbilityContext;let photoPicker = new picker.PhotoViewPicker(abilityContext);photoPicker.save(photoSaveOptions).then((photoSaveResult: Array<string>) => {hilog.info(0x0000, `photoPicker save success, uri: ${JSON.stringify(photoSaveResult)}`, '%{public}s');let uri: string = photoSaveResult[0] || '';let file = fs.openSync(uri, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE);fs.writeSync(file.fd, packerData);fs.closeSync(file.fd);}).catch((err: BusinessError) => {hilog.info(0x0000, `photoPicker save fail, err: ${JSON.stringify(err)}`, '%{public}s');});
}// 补零函数
function addSpaceZero(timeNum: number): string {return timeNum < 10 ? '0' + timeNum.toString() : timeNum.toString();
}

6. 总结

通过以上步骤,我们可以在鸿蒙开发中实现将图片数据保存到系统文件的功能,而无需申请 basic 权限。这种方式不仅简化了权限管理,还能满足某些特定场景的需求。希望本文的介绍能为您的开发工作提供帮助!

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

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

相关文章

茶聚场日事清实战案例:OKR目标管理+流程优化+看板会议系统深度应用

茶聚场通过引入日事清管理系统,有效解决了OKR不透明、跨区域协作低效及供应链管理分散等挑战,实现了目标对齐、流程优化与运营效率提升,支撑其在新茶饮市场的战略扩张。公司介绍 在2016年,一个新的品牌诞生在北京的商业心脏地带——茶聚场。作为茶聚场(北京)餐饮管理有限…

20250320日

01.军工 02.纳指etf 03.煤炭:04.红利etf 05.养殖ETF:06.白酒:

勤策、玄瞳、纷享销客对比,消费品领域CRM厂商怎么选?

近年来,随着消费品行业竞争加剧,CRM(客户关系管理)系统已成为企业提升运营效率、增强客户满意度的关键工具。其中,纷享销客、勤策、玄瞳等作为该领域的佼佼者,各自拥有独特的产品特点和适用企业类型。本文将此前三家主流快消领域CRM厂商进行全面对比,帮您理清各家厂商“…

Deepseek本地部署的webui可视化

1.WebUI可视化插件 —— Page Assist 在chrome应用商店中搜索Page Assist,找到后添加到chrome 浏览器添加完成后类似这样 点击这个扩展插件,即可看到 就可以进行对话聊天了

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

日事清以电商基因与高性价比集成方案,助力科木电商解决协作低效、流程散乱等管理痛点,实现母婴品牌“小鹿豆豆”的团队提效与目标追踪。一、关于科木电商“小鹿豆豆”,一个年轻的品牌,近期在无论是淘宝、拼多多还是抖音电商平台,都成了亮眼的爆品。这个由绵阳科木电子商务…

20241905 2024-2025-2 《网络攻防实践》 第4次作业

1. 实验内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 ARP缓存欺骗攻击:ARP协议在进行IP到MAC地址映射查询时存在安全缺陷,ARP协议为提高效率,设置了缓存机制,会将主…

ClkLog埋点系统客户案例-电子签佼佼者「大家签」为何选择ClkLog?

ClkLog的付费版上线已有一年多。作为一款从开源起步的产品,我们始终关注用户的使用体验。因此,近期我们发起了一轮客户回访,希望了解他们的使用情况及优化建议,并分享一些典型案例,让更多人看到ClkLog在真实业务场景中的价值。本次回访的客户是ClkLog最早的一批付费用户—…

国思RDIF低代码快速开发框架 v6.2版本发布

国思RDIF企业级低代码开发平台,给用户和开发者最佳的框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。致力于解决企业信息化项目交付难、实施效率低、开发成本高的问题。能帮助企业快速构建美观易用、架构专业、安全可控的企业级多终端应用,并可随需而变。1、…

如何用Leangoo破解需求隔离与频繁变更的协作困局?

本文探讨了敏捷工具在团队需求管理中的优缺点。四款主流敏捷工具有各自的特点和适用场景,适用于不同的团队和需求。领歌更加适合国内的中小团队快速迭代需求。作为一位经历过“需求文档满天飞、系统各自为战”的研发负责人,我深知团队在需求频繁变更时面临的痛点——信息割裂…

数字先锋 | 如何提升工业园区算力服务,天翼云息壤给出答案!

AI时代,算力作为数字化转型的关键生产力,重要性不言而喻。在城市发展中,一个城市的算力应用水平,直接决定了它在数字经济赛道的发展潜力。因此,加快建设算力产业、推动算力互联互通,成为我国各城市驱动经济社会快速发展的重要抓手。 在苏州市工业园区(以下简称“工业园区…

WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇

本文主要面向WPF和Avalonia熟手但是对前端不太擅长的.NET开发者,希望能够向各位介绍WPF和Avalonia的写法如何在前端中实现。并且得出了在 Grid 控件上,html 和 css 的支持性可以很完美的描述原本的 WPF 和 Avalonia Grid。WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇…

20244220 实验一《Python程序设计》实验报告

实验一 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;编写一个猜数字的游戏。(二)实验要求 熟悉Pycharm等开发环境; 掌握基本的Python运行和调试技能; 掌握基本的Python编程技能。 (…