HarmonyOS应用开发-手写板(二)

2023-12-20 01:36

本文主要是介绍HarmonyOS应用开发-手写板(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在前一篇手写板的文章中(HarmonyOS应用开发-手写板-CSDN博客),我们通过使用Path实现了一个基本的手写板,但遗憾的是,无法保存所绘制的图像。在本文中,我们将采用canvas和Path2D来重新构建手写板应用。依然只需几十行代码,就能轻松实现手写功能,并添加清空画布以及保存图片的功能。

一、先上效果图:

二、上代码

import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import buffer from '@ohos.buffer';@Entry
@Component
struct CanvasPage {//手写路径@State pathCommands: string = '';canvas: CanvasRenderingContext2D = new CanvasRenderingContext2D();path2D: Path2D = new Path2D();build() {Column() {Row() {//清空画布按钮Button("清空").margin(10).onClick(() => {//将路径置空this.path2D = new Path2D();//清空画布this.canvas.clearRect(0, 0, this.canvas.width, this.canvas.height);})Button("保存").onClick(() => {this.saveImage();})}Canvas(this.canvas).width('100%').height('100%').onTouch((e) => {this.onTouchEvent(e);})}}onTouchEvent(event: TouchEvent) {//手指按下和移动时的位置转换成像素位置let x = (event.touches[0].x);let y = (event.touches[0].y);switch (event.type) {//手指按下case TouchType.Down://移动到(x,y)点this.path2D.moveTo(x, y);break;//画线到(x,y)点case TouchType.Move:this.path2D.lineTo(x, y);//画笔颜色this.canvas.strokeStyle = "#0000ff";//画笔粗细this.canvas.lineWidth = 5;//画出线段this.canvas.stroke(this.path2D);break;default:break;}}saveImage() {//文件保存路径let uri = '';try {let PhotoSaveOptions = new picker.PhotoSaveOptions();//保存图片默认名称PhotoSaveOptions.newFileNames = ['11111.png'];let photoPicker = new picker.PhotoViewPicker();//调起系统的图片保存功能photoPicker.save(PhotoSaveOptions).then((PhotoSaveResult) => {uri = PhotoSaveResult[0];//获取图片的base64字符串let imageStr = this.canvas.toDataURL().split(',')[1];//打开文件let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);//base64字符串转成bufferconst decodeBuffer = buffer.from(imageStr, 'base64').buffer;//写入文件fs.writeSync(file.fd, decodeBuffer);//关闭文件fs.closeSync(file);}).catch((err: Error) => {console.error(err + '');})} catch (e) {console.error(e);}}
}

在这段代码中,根据功能划分,主要涵盖了三个关键操作:绘制路径、清空画布和保存画布。

一、绘制路径

        在绘制路径方面,代码通过Canvas执行图像绘制,同时借助Path2D定义了具体的绘制路径。手写路径的生成通过记录手指按下和移动的位置实现。具体操作包括:

this.path2D.moveTo(x, y)  // 移动到(x, y)点
this.path2D.lineTo(x, y)  // 画线到(x, y)点

二、清空画布

清空画布的操作分为两步:

1.将路径置空

// 重新生成新的Path2D对象,因为HarmonyOS中的Path2D没有reset方法
this.path2D = new Path2D();  

2.清空canvas

this.canvas.clearRect(0, 0, this.canvas.width, this.canvas.height);

三、保存画布

        保存画布的过程主要由saveImage方法完成,依赖于@ohos.file.picker组件,调用系统的图片保存功能。具体步骤包括:

  1. 通过PhotoViewPickersave方法获取用户选择的保存文件路径。
  2. 利用Canvas的toDataURL()方法将Canvas转换为base64字符串形式的图片。
  3. 通过@ohos.buffer将base64字符串转换为buffer。
  4. 最终,通过@ohos.file.fs将buffer写入文件,文件的路径为之前获取的保存路径。

        这一系列步骤成功实现了将绘制的图像保存为一个完整的图片文件。整体而言,代码清晰地展示了绘制路径、清空画布和保存画布的功能实现。

这篇关于HarmonyOS应用开发-手写板(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514401

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件