news 2026/4/23 12:15:53

二十四、【鸿蒙 NEXT】对组件截图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二十四、【鸿蒙 NEXT】对组件截图

【前言】

我们部分场景可能会有这种诉求,将页面中的某个组件进行截图,并将截图展示出来。下面我们介绍下如何在鸿蒙next系统中实现组件截图功能。

1、注册监听组件绘制完成的事件

我们要截图,首先要等组件绘制完成后才进行,否则截出的图片可能是一片空白,实现如下,主要用到的系统接口是inspector.ComponentObserver,其中'img'是Row组件的id,这里主要监听Row组件的draw事件,表示已经绘制完成

private listener:inspector.ComponentObserver = this.getUIContext().getUIInspector().createComponentObserver('img') this.listener.on('draw', () => { // todo 截取组件图片 }) build(){ Row(){ Image($r('app.media.startIcon')).width(100).height(100) Image($r('app.media.startIcon')).width(100).height(100) }.id('img') }

2、实现组件截图

在绘制完成的事件里面实现组件截图,代码如下,这里'img'是id,originImg的值是一个PiexelMap对象,可以直接传给Image组件展示,或者做其他操作

this.originImg = await this.getUIContext().getComponentSnapshot().get('img')

如果需要对获取的截图进行一些裁剪操作,比如高度裁剪一半,代码实现如下,这里主要用到了offscreenCanvas对象,实现图像裁剪的效果,其中screenCanvasContext.getPixelMap(0,50, viewWidth,viewHeight),0表示x轴方向不裁剪,50表示y轴方向,从50vp开始裁剪图片。

this.originImg = await this.getUIContext().getComponentSnapshot().get('img') let viewInfo = this.getUIContext().getComponentUtils().getRectangleById('img') let viewWidth = this.getUIContext().px2vp(viewInfo.size.width) let viewHeight = this.getUIContext().px2vp(viewInfo.size.height) let screenCanvas = new OffscreenCanvas(viewWidth, viewHeight) let screenCanvasContext = screenCanvas.getContext('2d', new RenderingContextSettings(true)) screenCanvasContext.drawImage(this.originImg,0,0,viewWidth,viewHeight) this.cropImg = screenCanvasContext.getPixelMap(0,50, viewWidth,viewHeight)

实现图片截取的效果如下:

完整的代码实现如下,这里注意下,截取组件图片时,使用了setTimeout函数,这里如果不使用的话会出现截出空白图片的情况。另外,这里的Row组件中的Image图片也可以是网络图片,这里的截图方式,即使是网络图片也能实现截图。这里之所以要做px2vp操作,是因为OffscreenCanvas接收的是vp为单位的数值,而getComponentSnapshot获取的宽高是px为单位的数值

import { inspector } from '@kit.ArkUI'; @Entry @Component struct DrawPage { @State message: string = 'Hello World'; @State originImg:PixelMap|null = null @State cropImg:PixelMap|null = null private listener:inspector.ComponentObserver = this.getUIContext().getUIInspector().createComponentObserver('img') private onDrawComplete = () => { setTimeout(async () => { this.originImg = await this.getUIContext().getComponentSnapshot().get('img') let viewInfo = this.getUIContext().getComponentUtils().getRectangleById('img') let viewWidth = this.getUIContext().px2vp(viewInfo.size.width) let viewHeight = this.getUIContext().px2vp(viewInfo.size.height) let screenCanvas = new OffscreenCanvas(viewWidth, viewHeight) let screenCanvasContext = screenCanvas.getContext('2d', new RenderingContextSettings(true)) screenCanvasContext.drawImage(this.originImg,0,0,viewWidth,viewHeight) this.cropImg = screenCanvasContext.getPixelMap(0,50, viewWidth,viewHeight) },500) } aboutToAppear(): void { this.listener.on('draw', this.onDrawComplete) } build() { Column() { Text('原始组件:') Row(){ Image($r('app.media.startIcon')).width(100).height(100) Image($r('app.media.startIcon')).width(100).height(100) }.id('img') Column().height(20) Text('截取的完整图片:') Image(this.originImg).width(200).height(100) Column().height(20) Text('裁剪一半的图片:') Image(this.cropImg).width(200).height(100) } .height('100%') .width('100%') } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 5:36:15

嘉立创PCB布线实战案例:基于EasyEDA的双层板设计

从零开始搞定双层PCB:EasyEDA 嘉立创实战全记录 你有没有过这样的经历? 辛辛苦苦画完原理图,信心满满导入PCB,结果一布线就“卡壳”——走线绕来绕去、电源噪声大、晶振不启振、USB通信时断时续……最后只能靠飞线救场。 别急…

作者头像 李华
网站建设 2026/4/14 4:47:28

企业级语音处理方案:基于Fun-ASR构建私有ASR服务

企业级语音处理方案:基于Fun-ASR构建私有ASR服务 在金融会议、医疗问诊或政务接访的现场,一段段录音被反复回放,只为提取关键信息——这曾是许多企业日常工作的缩影。如今,随着AI语音识别技术的成熟,将“听”这一动作自…

作者头像 李华
网站建设 2026/4/20 12:15:23

通俗解释SystemVerilog中类与对象的关系模型

类与对象:SystemVerilog中的“图纸”与“房子”你有没有想过,写一个验证平台其实就像盖一栋大楼?设计师先画出建筑蓝图——哪些房间、多大面积、水电怎么走;然后施工队按图建造,每一层楼都长得差不多,但住的…

作者头像 李华
网站建设 2026/4/23 7:27:32

GitHub Gist快速保存Fun-ASR识别结果片段

GitHub Gist 快速保存 Fun-ASR 识别结果片段 在语音技术日益渗透办公、教育和客服场景的今天,如何高效处理转写后的文本内容,正成为实际落地中的“最后一公里”难题。通义与钉钉联合推出的 Fun-ASR 系统,凭借其强大的端到端模型能力和简洁的…

作者头像 李华
网站建设 2026/4/23 10:17:51

微pe备份还原功能保护GLM-TTS已配置好的环境

微PE备份还原功能保护GLM-TTS已配置好的环境 在AI语音合成项目开发中,最令人头疼的往往不是模型调参或推理优化,而是那个“昨天还好好的,今天却跑不起来”的环境问题。尤其是像 GLM-TTS 这类依赖复杂、组件耦合紧密的大模型系统——一次误装的…

作者头像 李华
网站建设 2026/4/18 22:08:35

实时语音转写不再是梦:Fun-ASR流式识别模拟方案

实时语音转写不再是梦:Fun-ASR流式识别模拟方案 在远程会议频繁召开、线上教学常态化、智能客服全天候运行的今天,用户早已不满足于“录完再听、听完再转”的语音处理模式。他们希望——我说,你就得立刻写出来。 可现实是,大多数高…

作者头像 李华