鸿蒙中对某个组件截图并保存截图到本地

news/2025/3/28 10:48:34/文章来源:https://www.cnblogs.com/cbnh/p/18784577


应用场景
有时候我们需要分享某个组件内容,而不是利用系统级别的截图保存整个屏幕内容,就需要使用单独对组件截图的API,并且需要把截取的图片存入本地相册。

核心API
componentSnapShot 根据组件id截取组件图片
ImagePacker 图片压缩或重新打包
fileIo读写文件

首先要先截取组件 componentSnapshot
给你想截图的组件一个唯一的id标识

Column() {

}
.id('share') // 用于后续截图使用

根据组件的id调用componentSnapShot的方法生成截图对象

const pixelMap = await componentSnapshot.get('share')

转成二进制数据流 ImagePacker
先创建imagePacker的实例

后面的配置项是生成的图片格式和图片质量

const imagePacker = image.createImagePacker()
const arrayBuffer = await imagePacker.packToData(pixelMap,
{ format: "image/jpeg", quality: 98 }
)

读写文件 fileIo
需要使用上下文

用时间戳设置唯一文件名

使用fileIo打开或者创建文件

写入二进制数据

关闭文件

// 3.借助fileIo读写文件
// 3.1获取上下文
const ctx = getContext(this)
// 3.2获取沙箱中存图的路径
const imagePath = ctx.cacheDir + '/' + Date.now() + '.jpeg'
// 3.3以 创建 或 读写 的模式打开文件(没有则创建并打开,有则打开)
const file = fileIo.openSync(imagePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
// 3.4同步写入二进制数据流到文件中
fileIo.writeSync(file.fd, arrayBuffer)
// 3.5同步去关闭文件
fileIo.closeSync(file.fd)
把沙箱里的文件写入相册
这里是固定写法

但是资产变更这一步需要配置ohos.permission.WRITE_IMAGEVIDEO权限

不过本次我们通过saveButton的方式暂时性获取权限

// 4. 把沙箱中的文件写入相册
// 4.1 获取资源文件的uri地址
const imgUrl = fileUri.getUriFromPath(imagePath)
// 4.2 进行图片资产变更(私有->公有)
const assetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(ctx, imgUrl);
// 4.3 提交媒体变更请求
// 4.3.1 获取相册管理模块的实例
const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(ctx)
// 4.3.2 调用资产变更方法
// 需要配置权限: permission: ohos.permission.WRITE_IMAGEVIDEO
await phAccessHelper.applyChanges(assetChangeRequest);

saveButton的用法
主要是配置和事件参数

默认创建带有图标 icon、文本 text、背景 buttonType的保存按钮。

不支持通用事件,仅支持onclick()

onClick(event: (event: ClickEvent, result: SaveButtonOnClickResult) => void)

关于result:

是只有success和另一个失败的枚举。

存储权限的授权结果,授权时长为10秒,即触发点击后,可以在10秒之内不限制次数的调用特定媒体库接口,超出10秒的调用会鉴权失败。
SaveButton({
icon: SaveIconStyle.FULL_FILLED, // 图标
text: SaveDescription.SAVE_IMAGE, // 文字
buttonType: ButtonType.Normal // 按钮样式
})
.onClick((event: ClickEvent, result: SaveButtonOnClickResult) => {
// 判断是否有权限,有则调用存本地方法
if (result === SaveButtonOnClickResult.SUCCESS) {
this.saveImage()
}
})

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

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

相关文章

bayaim-如何保证Redis中的数据都是热点数据?

——————————————————————————————————————————————————— ---- bayaim,申明:本文摘自:https://mp.weixin.qq.com/s?__biz=MzAwNDUxOTQ5MQ==&mid=2247623691&idx=1&sn=35e1b6e9206458f9fcd99e48bebccc13&…

translator

import streamlit as st import time import base64 from streamlit.components.v1 import html# 自定义CSS样式 def set_custom_style():st.markdown(""" <style>/* 页面背景:浅色渐变,提高可读性 */.main {background: linear-gradient(135deg, #E0F7…

AI+CRM纷享汇湖南株洲站圆满落幕

近日,由株洲工业和信息化局指导,湘数促会株洲联络处主办,华为云、纷享销客共同承办的“智变未来营销破局”暨企业CRM应用与发展趋势纷享汇在湖南株洲成功举办。此次活动吸引了近40位湘企高管参与,共同探讨企业数字化转型与营销破局的新路径。 一、华为云助力企业数字化转型…

postgresql 16版本之后使用yum方式下载

1.登录下载地址https://www.postgresql.org/download/linux/redhat/

bilibili 分段进度跳转

编辑好后重新投稿即可

谷歌浏览器Chrome安装历史版本

连接:https://downzen.com/en/windows/google-chrome/versions/?page=4 首先,打开网址 然后选择所需要的版本进行下载

LevOJ.sln - 第五期

LevOJ - 字符串专题解决方法 LevOJ平台.sln苯蒟蒻也没系统学过算法,群佬有更高级的算法一定要在评论区贴一下喵~P1034 字符串的循环移位 问题描述解决方法 #include <iostream> #include <string> using namespace std;int main() {int n;cin >> n;string s…

DeepSeek R1 + Ollama + Cherry Studio 实现本地化部署 + 可视化访问,真的太香了!

大家好,我是R哥。 今天继续聊聊 DeepSeek R1 本地部署和可视化访问。 上一期的分享了 DeepSeek R1 本地部署实战教程来了,带可视化界面,非常详细!,使用的是 Ollama + Open WebUI 实现的。 今天再分享一种方案:Ollama + Cherry Studio,这是一种 AI 客户端形式,而非网页,…

国内值得去的955神仙公司排行榜

在科技行业竞争日益激烈、“内卷” 成风的当下,“955” 工作制宛如一股清流,让打工人看到了工作与生活平衡的曙光。今天,咱们就来唠唠国内外那些既有着出色业务,又能让员工享受 “955” 神仙公司。 先解释一下,所谓的955是指: 工作日早9点上班、晚5点下班、一周工作5天,中…

Windows11系统下使用Docker Desktop 部署Nginx

在Windows系统安装完成Docker Desktop后,基于Docker部署Nginx前排提醒: 1. 本教程的前提是已经安装完成Docker Desktop,若还没安装,可以参考博主的另一篇教程:Windows11安装Docker Desktop 2. 操作系统:Windows11,Docker Desktop版本:4.38.0,Nginx版本:1.13.8第一步:…

Ftrans超大附件插件一键解决难题:outlook邮箱大文件怎么发送?

在日常办公中,通过outlook邮箱发送文件是一种至关重要的沟通和协作工具,具有多方面的作用,并且应用场景广泛。但在实际使用中,也会碰到outlook邮箱大文件怎么发送的难题。可以来了解一下: 一、应用场景 1、内部沟通 日常工作安排:上级领导通过邮件向下属布置工作任务,明…

IDEA-idea2013连接Mysql数据库

IDEA-idea2013连接Mysql数据库 右侧DataBase图表,选择Mysql输入用户名和密码 => 点击TestConnection成功会显示点击这里选择schemas