当前位置: 首页 > news >正文

可可图片编辑 HarmonyOS(7)图片绘画

可可图片编辑 HarmonyOS(7)图片绘画

前言

可可图片编辑 实现 在上传图片,然后在已有图片上绘画的功能。

该功能主要也是利用了canvas画布功能,把选择的图片 转换成画布,然后在上面直接描绘。

使用 canvas 的 drawImage 描绘图片

演示如何通过CanvasRenderingContext2D的drawImage方法实现图片渲染及尺寸控制

  1. 创建渲染上下文

    • 通过RenderingContextSettings配置抗锯齿属性(true表示启用)
    • 初始化CanvasRenderingContext2D对象,作为2D绘图的入口
  2. 加载图片资源

    • 使用ImageBitmap全局类加载本地图片资源(“images/1.jpg”)
    • 创建位图对象后可直接用于Canvas绘制,相比Image组件更适用于像素级操作
  3. 构建UI布局

    • 通过Column容器创建垂直布局
    • 设置Canvas组件尺寸为100%宽度+固定高度,背景色为浅灰色
    • 使用.onReady生命周期回调确保Canvas初始化完成后执行绘制操作
  4. 执行绘制操作

    • 基础绘制drawImage(this.img, 0, 0)将图片绘制在Canvas左上角(0,0)位置

    • 缩放绘制:drawImage(this.img, 0, 150, 200, 150)

      指定绘制区域,实现:

      • 源图片按原始比例缩放至200x150像素
      • 绘制起点位于Canvas坐标(0,150)处
    • 两种调用方式分别对应W3C标准的drawImage重载方法:

      • drawImage(image, dx, dy)
      • drawImage(image, dx, dy, dWidth, dHeight)

示例代码

@Entry
@Component
struct CanvasDrawImageExample {// 1. 创建Canvas渲染上下文private settings: RenderingContextSettings = new RenderingContextSettings(true);private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);// 2. 创建图片对象 - 注意:ImageBitmap是全局类,不从image命名空间导出private img: ImageBitmap = new ImageBitmap("images/1.jpg"); //默认的图片build() {Column() {// 3. 创建Canvas组件Canvas(this.context).width('100%').height(400).backgroundColor('#F1F3F5').onReady(() => {// 4. 在Canvas准备就绪后绘制图片this.context.drawImage(this.img, 0, 0);this.context.drawImage(this.img, 0, 150, 200, 150);})}.width('100%').padding(10)}
}

使用 canvas 使用 PixelMap 绘制图片

实现图片资源的异步加载与Canvas上的自定义绘制,支持图片缩放/位置控制。
主要逻辑:

  1. 模块导入

    • 通过@kit.ImageKit引入鸿蒙系统的图像处理能力,用于操作PixelMap像素数据。
  2. 组件定义

    • 使用@Entry标记为应用入口组件,@Component声明为自定义组件。
    • 创建CanvasRenderingContext2D渲染上下文,配置抗锯齿(RenderingContextSettings(true))。
  3. 资源预加载

    • aboutToAppear

      生命周期中:

      • 调用image.createImageSource创建图片源(沙箱路径需替换为实际地址)。
      • 通过createPixelMap()异步生成像素数据,赋值给pixelMap变量。
  4. Canvas绘制

    • build函数中构建UI,设置Canvas尺寸与背景色。

    • 通过 onReady

      回调确保Canvas初始化完成后:

      • 检测pixelMap是否加载完成(避免空指针)。
      • 调用drawImage绘制图片,参数0,0,300,200表示将图片缩放至300x200尺寸并绘制到Canvas左上角。

示例代码

import { image } from '@kit.ImageKit';@Entry
@Component
struct CanvasDrawPixelMapExample {private settings: RenderingContextSettings = new RenderingContextSettings(true);private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);private pixelMap: image.PixelMap | undefined = undefined;// 组件初始化时加载图片aboutToAppear() {// 创建ImageSource并获取PixelMaplet imageSource = image.createImageSource("沙箱图片地址");imageSource.createPixelMap().then((pixelMap) => {this.pixelMap = pixelMap;});}build() {Column() {Canvas(this.context).width('100%').height(400).backgroundColor('#F1F3F5').onReady(() => {// 检查pixelMap是否已加载if (this.pixelMap) {// 使用PixelMap绘制图片this.context.drawImage(this.pixelMap, 0, 0, 300, 200);}})}.width('100%').padding(10)}
}

文章转载自:

http://Q7cOmoH8.nbsbn.cn
http://sPTAlTMP.nbsbn.cn
http://22YdXfPA.nbsbn.cn
http://ezNxRThO.nbsbn.cn
http://lG0bH2ci.nbsbn.cn
http://Kd4tnDUL.nbsbn.cn
http://Maf0BISd.nbsbn.cn
http://Vtyc15I5.nbsbn.cn
http://iIDX3FJZ.nbsbn.cn
http://ynKnCUeZ.nbsbn.cn
http://ZEGxbzrb.nbsbn.cn
http://zUc7JQcT.nbsbn.cn
http://79dguJAw.nbsbn.cn
http://rsRWMPRc.nbsbn.cn
http://MM41XIlp.nbsbn.cn
http://quXCTYkr.nbsbn.cn
http://mkP4B4sj.nbsbn.cn
http://PYjI3jky.nbsbn.cn
http://wVTMvSSv.nbsbn.cn
http://WoCDLuwC.nbsbn.cn
http://Xdt2BcK6.nbsbn.cn
http://tv94RKXC.nbsbn.cn
http://xHU2UkW3.nbsbn.cn
http://8uFAWFgN.nbsbn.cn
http://xaQgijNJ.nbsbn.cn
http://2GWPY9Ts.nbsbn.cn
http://JWlOa2iY.nbsbn.cn
http://Tb1IcqMy.nbsbn.cn
http://awCzXJbA.nbsbn.cn
http://GqTzvgLc.nbsbn.cn
http://www.dtcms.com/a/384674.html

相关文章:

  • django登录注册案例(上)
  • 查看iOS设备文件管理 访问iPhone用户文件、App沙盒目录 系统日志与缓存
  • 基于Echarts+HTML5可视化数据大屏展示-白茶大数据溯源平台V2
  • android 框架—网络访问Okhttp
  • CUDA 中Thrust exclusive_scan使用详解
  • Quat 四元数库使用教程:应用场景概述
  • GitHub 热榜项目 - 日榜(2025-09-15)
  • 让AI数据中心突破性能极限
  • Self-supervised Feature Adaptation for 3D Industrial Anomaly Detection 论文精读
  • 【3D图像算法技术讨论】如何给基于3dgs重建的城市街景增加碰撞的属性,满足仿真的要求?
  • numpy学习笔记
  • Oracle体系结构-归档日志文件(Archive Log Files)
  • 唐源电气:机器视觉与AI Agent引领智能运维
  • 【Python】在pycharm中使用environment.ylm文件配置虚拟环境
  • 2025前端面试题及答案-2(详细)
  • 技术突破:《Light Sci. Appl.》SH-GSL理论,为超表面提供全通道谐波调控能力
  • 2025年ASOC SCI2区TOP,多类别教学优化算法+多修剪机器人与多施肥无人机协同任务分配,深度解析+性能实测
  • 佰力博检测与您探讨高低温介电测试的应用领域
  • 网络编程-day6
  • 【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
  • 《格式工厂FormatFactory》 [5.21.0][便携版] 下载
  • 【ubuntu24.04】安装rust
  • vue-sync修饰符解析以及切换iframe页面进行保存提示功能的思路
  • 005 Rust变量与常量
  • DOM---操作元素样式属性详解
  • Excel简单教程
  • Node.js 项目依赖包管理
  • LabVIEW命令行使用方法
  • 单变量单步时序预测 | TCN-LSTM时间卷积结合长短期记忆神经网络(MATLAB)
  • ESLint 自定义 Processor(处理器)