
可可图片编辑 HarmonyOS(7)图片绘画 原创 精华
可可图片编辑 HarmonyOS(7)图片绘画
前言
可可图片编辑 实现 在上传图片,然后在已有图片上绘画的功能。
该功能主要也是利用了canvas画布功能,把选择的图片 转换成画布,然后在上面直接描绘。
使用 canvas 的 drawImage 描绘图片
演示如何通过CanvasRenderingContext2D的drawImage方法实现图片渲染及尺寸控制
-
创建渲染上下文
- 通过
RenderingContextSettings
配置抗锯齿属性(true表示启用) - 初始化
CanvasRenderingContext2D
对象,作为2D绘图的入口
- 通过
-
加载图片资源
- 使用
ImageBitmap
全局类加载本地图片资源(“images/1.jpg”) - 创建位图对象后可直接用于Canvas绘制,相比Image组件更适用于像素级操作
- 使用
-
构建UI布局
- 通过
Column
容器创建垂直布局 - 设置Canvas组件尺寸为100%宽度+固定高度,背景色为浅灰色
- 使用
.onReady
生命周期回调确保Canvas初始化完成后执行绘制操作
- 通过
-
执行绘制操作
-
基础绘制:
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上的自定义绘制,支持图片缩放/位置控制。
主要逻辑:
-
模块导入
- 通过
@kit.ImageKit
引入鸿蒙系统的图像处理能力,用于操作PixelMap像素数据。
- 通过
-
组件定义
- 使用
@Entry
标记为应用入口组件,@Component
声明为自定义组件。 - 创建
CanvasRenderingContext2D
渲染上下文,配置抗锯齿(RenderingContextSettings(true)
)。
- 使用
-
资源预加载
-
在
aboutToAppear
生命周期中:
- 调用
image.createImageSource
创建图片源(沙箱路径需替换为实际地址)。 - 通过
createPixelMap()
异步生成像素数据,赋值给pixelMap
变量。
- 调用
-
-
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并获取PixelMap
let 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)
}
}
以往文章
-
我的iMaHarmonyOS 知识库接入 鸿蒙6 API20 新特性了
https://mp.weixin.qq.com/s/YsbFQyi5PsndpRUaA9h_dA?token=830743671&lang=zh_CN
-
鸿蒙创新赛 HarmonyOS 6.0.0(20) 关键特性汇总
-
可可图片编辑 HarmonyOS(4)图片裁剪-canvas
-
可可图片编辑 HarmonyOS(3)应用间分享图片
近期活动
最近想要想要考取 HarmonyOS 基础或者高级证书,或者快要获取的同学都可以点击这个链接,加入我的班级,考取成功有机会获得鸿蒙礼盒一份。
联系我
带你了解更多HarmonyOS相关的资讯。
