可可图片编辑 HarmonyOS(6)水印效果

可可图片编辑 HarmonyOS(6)水印效果

前言

可可图片编辑 也实现了水印效果,这个功能的实现比较取巧。

在预览阶段,直接通过层叠布局来实现水印效果。

在保存图片时,使用组件截图 componentSnapshot 的知识实现保存图片。

developer.huawei.com/consumer/cn...

componentSnapshot 介绍

componentSnapshot 是 HarmonyOS提供的一个强大功能,允许开发者获取应用中组件的截图,生成 PixelMap 格式的图片数据。这对于实现分享功能内容保存动态生成图片等场景非常有用。

基本使用步骤

1. 准备工作:添加组件标识

首先需要为想要截图的组件添加唯一标识:

typescript 复制代码
// 在build方法中为组件添加id
build() {
  Column() {
    // 需要截图的组件
    Column() {
      Text('这是要截图的内容')
        .fontSize(20)
      Image($r('app.media.icon'))
        .width(100)
        .height(100)
    }
    .id('targetComponent') // 添加唯一标识
    
    // 其他UI组件...
  }
}

2. 获取截图的基本方法

方法一:异步获取(推荐)
typescript 复制代码
import { image } from '@kit.ImageKit';

// 在按钮点击或其他事件中
async takeScreenshot() {
  try {
    // 获取UIContext
    const uiContext = this.getUIContext();
    
    // 使用componentSnapshot获取截图
    const pixelMap = await uiContext.getComponentSnapshot()
      .get('targetComponent', { 
        scale: 1.0, // 缩放比例
        waitUntilRenderFinished: true // 等待渲染完成
      });
    
    // 处理截图结果
    this.handleScreenshotResult(pixelMap);
  } catch (error) {
    console.error('截图失败:', error);
  }
}

// 处理截图结果
handleScreenshotResult(pixelMap: image.PixelMap) {
  // 可以显示在Image组件中
  this.screenshotImage = pixelMap;
  
  // 或者保存到文件
  // this.saveToFile(pixelMap);
}
方法二:同步获取
typescript 复制代码
takeScreenshotSync() {
  try {
    const uiContext = this.getUIContext();
    const pixelMap = uiContext.getComponentSnapshot()
      .getSync('targetComponent', {
        scale: 0.8,
        waitUntilRenderFinished: true
      });
    
    this.handleScreenshotResult(pixelMap);
  } catch (error) {
    console.error('同步截图失败:', error);
  }
}

3. 显示截图结果

typescript 复制代码
// 在build方法中显示截图
build() {
  Column() {
    // 原始内容
    Column() {
      // ...原有内容
    }
    .id('targetComponent')
    
    // 截图结果显示
    Image(this.screenshotImage)
      .width(200)
      .height(200)
      .margin(10)
      .visibility(this.screenshotImage ? Visibility.Visible : Visibility.None)
    
    // 截图按钮
    Button('截图')
      .onClick(() => this.takeScreenshot())
      .margin(10)
  }
}

4. 完整示例代码

typescript 复制代码
import { image } from '@kit.ImageKit';

@Entry
@Component
struct ScreenshotExample {
  @State screenshotImage: image.PixelMap | undefined = undefined;

  // 异步截图方法
  async takeScreenshot() {
    try {
      const uiContext = this.getUIContext();
      const pixelMap = await uiContext.getComponentSnapshot()
        .get('contentToCapture', {
          scale: 1.0,
          waitUntilRenderFinished: true
        });
      
      this.screenshotImage = pixelMap;
    } catch (error) {
      console.error('截图失败:', error);
    }
  }

  build() {
    Column({ space: 20 }) {
      // 目标截图区域
      Column() {
        Text('欢迎使用组件截图功能')
          .fontSize(24)
          .fontColor(Color.Blue)
        
        Text('这是可以截图的内容区域')
          .fontSize(16)
          .margin({ top: 10 })
        
        Image($r('app.media.logo'))
          .width(120)
          .height(120)
          .margin({ top: 20 })
      }
      .id('contentToCapture')
      .padding(20)
      .border({ width: 2, color: Color.Gray })

      // 截图结果显示
      if (this.screenshotImage) {
        Image(this.screenshotImage)
          .width(300)
          .height(200)
          .border({ width: 1, color: Color.Black })
      }

      // 操作按钮
      Button('截图')
        .width(120)
        .onClick(() => this.takeScreenshot())
    }
    .width('100%')
    .padding(20)
  }
}

5. SnapshotOptions 重要参数说明

配置选项:

  • scale: number - 缩放比例(0.1-1.0),默认1.0
  • waitUntilRenderFinished: boolean - 是否等待渲染完成(推荐设为true)
  • region: Object - 指定截图区域
    • start: number - 起始x坐标
    • top: number - 起始y坐标
    • end: number - 结束x坐标
    • bottom: number - 结束y坐标

以往文章

相关推荐
这是个栗子2 分钟前
AI辅助编程(一) - ChatGPT
前端·vue.js·人工智能·chatgpt
2501_944448003 分钟前
Flutter for OpenHarmony衣橱管家App实战:预算管理实现
前端·javascript·flutter
Remember_9936 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
笨蛋不要掉眼泪9 分钟前
Redis持久化解析:RDB和AOF的对比
前端·javascript·redis
心.c11 分钟前
Vue3+Node.js实现文件上传分片上传和断点续传【详细教程】
前端·javascript·vue.js·算法·node.js·哈希算法
We་ct12 分钟前
LeetCode 48. 旋转图像:原地旋转最优解法
前端·算法·leetcode·typescript
前端世界14 分钟前
鸿蒙分布式网络性能优化实战:从通信建连到多设备协同
网络·分布式·harmonyos
黄筱筱筱筱筱筱筱22 分钟前
7.适合新手小白学习Python的异常处理(Exception)
java·前端·数据库·python
qq_1777673723 分钟前
React Native鸿蒙跨平台音乐播放器涉及实时进度更新、播放控制、列表交互、状态管理等核心技术点
javascript·react native·react.js·ecmascript·交互·harmonyos
2501_9209317026 分钟前
React Native鸿蒙跨平台实现了简单的商品图片轮播功能,为用户提供了直观的商品图片浏览体验,帮助用户全面了解商品外观
javascript·react native·react.js·ecmascript·harmonyos