组件截图sdk -- screenshot_hm介绍 ##三方SDK##

大家可以试想一下这样的功能场景:

  1. 用户在完成了一系列的学习积分和考试后,能够获得一张证书,这个证书除了通用的底图外,对于姓名,时间,成绩等数据是根据用户情况动态生成的,然后还需要有将证书保存到相册的情况

  2. 在一些记账类app中,用户可以通过图表的形似查看自己的消费趋势,并期望将这个图表以图片的形式保存下来

  3. 在一些AI生成类项目中,对于AI生成的内容,通过图片形式保存到相册里以方便分享,或者直接导出图片格式后进行分享操作

对于以上这些功能,都需要用到"组件截图"这个功能模块,当然,现在鸿蒙已经提供了@ohos.arkui.componentSnapshot (组件截图)这个现成的模块,但是,除了基本的导出PixelMap格式的图片信息以外,其他的操作,例如保存到相册等功能还是要做一些其他操作的,为了简化整个流程,推荐一个第三方的库:screenshot_hm

功能特性

  • 组件截图: 支持对任意设置了ID的组件进行截图
  • 动态内容支持: 完美支持@State状态变化、ForEach列表渲染等动态内容的截图
  • 原生SaveButton: 使用官方SaveButton组件,自动处理权限和用户交互
  • 临时文件机制: 截图生成临时文件,通过SaveButton保存到相册
  • 本地文件保存: 同时支持保存到应用本地文件系统
  • 截图预览: 支持在应用内预览截图效果
  • 高质量输出: 支持PNG格式,100%质量输出
  • 资源管理: 自动释放内存资源,避免内存泄漏

基础安装

typescript 复制代码
ohpm install screenshot_hm

1. 导入库文件

typescript 复制代码
import { ScreenshotUtils } from 'screenshot_hm';

核心实现

1. 截图工具类

ScreenshotUtils.ets 提供了完整的截图功能:

typescript 复制代码
// 截图并保存到临时文件,返回文件路径供SaveButton使用
const tempPath = await ScreenshotUtils.captureAndSaveToTemp(
  'componentId',     // 组件ID
  context,           // 应用上下文
  'filename.png'     // 可选的文件名
);

// 获取截图PixelMap
const pixelMap = await ScreenshotUtils.captureComponentToPixelMap('componentId');

// 将PixelMap保存到临时文件
const tempPath = await ScreenshotUtils.savePixelMapToTemp(pixelMap, context);

// 预览截图
await ScreenshotUtils.previewCapture('componentId', (pixelMap) => {
  // 处理截图预览
});

2. SaveButton使用方式

按照华为官方文档标准实现:

typescript 复制代码
SaveButton() // 创建安全控件按钮。
   .onClick(async (event, result: SaveButtonOnClickResult) => {
      if (result == SaveButtonOnClickResult.SUCCESS) {
         try {
            let context = getContext();
            let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);


            let path = await ScreenshotUtils.captureAndSaveToTemp(
               "jietu",   //组件的id
               this.context,  //  private context = getContext(this) as common.UIAbilityContext;
               `component_${Date.now()}.png` //文件名
            );

            let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, path);
            await phAccessHelper.applyChanges(assetChangeRequest);
            console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri);
         } catch (err) {
            console.error(`create asset failed with error: ${err.code}, ${err.message}`);
         }
      } else {
         console.error('SaveButtonOnClickResult create asset failed');
      }
   })

可以看到整体使用方式非常简单,和使用componentSnapshot一样,只需要对组件指定一个id就可以进行截图,但相比之下,在保存到相册、形成临时文件方面,比直接使用componentSnapshot简单了太多

相关推荐
L-影1 分钟前
FastAPI CORS 跨域:Web 世界的“小区门禁”与“访客通行证”
前端·javascript·fastapi
stereohomology7 分钟前
已进入初赛提交Demo的两个项目:(2)单独html钢琴
前端·html·why不coding
源图客14 分钟前
Claude Code基础使用
服务器·前端·数据库
在书中成长25 分钟前
HarmonyOS 小游戏《对战五子棋》开发第8篇 - GomokuEngine核心引擎设计(三):五子连珠判定算法
算法·华为·harmonyos
川石课堂软件测试26 分钟前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
asdzx6729 分钟前
在 React 中轻松实现 PDF 转 Word:纯前端 WASM 方案实战
前端·react.js·pdf
爱勇宝9 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
最爱老式锅包肉9 小时前
《HarmonyOS技术精讲-Core Speech Kit(基础语音服务)》第2篇:语音识别核心功能——流式与非流式实现
语音识别·xcode·harmonyos
梨子同志10 小时前
常用命令
前端
梨子同志10 小时前
React 状态管理
前端