canvas绘制签名并保存

news/2025/2/13 20:59:24/

实现签名的三个关键方法:

1.mousedown:当鼠标按下时开始绘制签名。

2.mousemove:鼠标移动时持续绘制。

3.mouseup:鼠标抬起时结束绘制。

html:

<div class="setSign"><canvasref="canvas"@mousedown="startDrawing"@mousemove="draw"@mouseup="stopDrawing"></canvas>
</div>
<div class="btns"><el-button @click="handleClose">取 消</el-button><el-button type="danger" @click="clearCanvas">清 空</el-button><el-button type="primary" @click="saveSignature">保 存</el-button>
</div>

js:

import { getSignNew, saveSignNew } from "@/api/common";
export default {mixins: [],components: {},props: {},
data() {return {isDrawing: false,canvas: null,context: null,savedImage: null,queryObj: {},};
},created() {},mounted() {this.queryObj = this.$common.convertKeys(this.$route.query);getSignNew(this.queryObj).then((data) => {// 请求到签名的base64格式,如果是存在后端的图片那么需要自己转为base64if (data && data.data.flag && data.data.datas.length > 0) {this.savedImage = data.data.datas[0]["BASE64IMG"];var bgImg = new Image();bgImg.src = this.savedImage;bgImg.onload = () => {this.$nextTick(() => {// 获取容器的宽高let box = document.querySelector(".setSign");let w = box.clientWidth;let h = box.clientHeight;// 给容器设置paddinglet padding = 20;this.canvas = this.$refs.canvas;this.canvas.height = h - padding; //获取画布的高度this.canvas.width = w - padding; //获取画布的宽度this.context = this.canvas.getContext("2d");this.context.drawImage(bgImg, 0, 0);this.context.lineWidth = 3; //设置线条宽度this.context.strokeStyle = "#000"; //字体颜色});};}}).catch((err) => {this.$message.error("获取签名图片失败");});},methods: {startDrawing() {this.isDrawing = true;const rect = this.canvas.getBoundingClientRect();this.context.beginPath();this.context.moveTo(event.clientX - rect.left, event.clientY - rect.top);},draw() {if (!this.isDrawing) return;const rect = this.canvas.getBoundingClientRect();this.context.lineTo(event.clientX - rect.left, event.clientY - rect.top);this.context.stroke();},stopDrawing() {this.isDrawing = false;},// 清空画布clearCanvas() {this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);this.savedImage = null;},// 保存签名saveSignature() {// 获取图片的base64this.savedImage = this.canvas.toDataURL();let submitObj = {base64img: this.savedImage,...this.queryObj,};saveSignNew(submitObj).then((data) => {if (data && data.data.flag) {this.$message.success("保存成功");}});},},
};
</script>

效果图: 

 


http://www.ppmy.cn/news/1186893.html

相关文章

qt 系列(一)---qt designer设计常用操作

最近转战qt, 主要用qt designer 进行GUI开发&#xff0c;记录下实战经验~ 1.前言 qt 是跨平台C图形用户界面应用程序开发框架&#xff0c;可以使用的IDE工具有 qt creator 和 vs, 这里我主要使用 Visual Studio 2017 工具进行程序开发与编写。 2. 环境配置 只写关键步骤~~ …

【机器学习】一、机器学习概述与模型的评估、选择

机器学习简介 由来 阿瑟.萨缪尔Arthur Samuel,1952年研制了一个具有自学习能力的西洋跳棋程序&#xff0c;1956年应约翰.麦卡锡John McCarthy&#xff08;人工智能之父&#xff09;之邀&#xff0c;在标志着人工智能学科诞生的达特茅斯会议上介绍这项工作。他发明了“机器学习…

k8s 集群的组成和原理

集群 集群是一组节点&#xff0c;这些节点可以是物理服务器也可以是虚拟机&#xff0c;在它们中安装了k8s的环境。 集群的组成 k8s 集群由 worker 节点和 node 节点组成&#xff0c;其中worker节点由Controller Manager(控制管理器)、etcd(键值数据库)、scheduler(调度器)、…

Linux服务器等保测评命令

最近公司等保&#xff0c;就罗列了一些测评命令&#xff0c;记录下 LANG"en_US.UTF-8" #临时设置utf8编码 ip addr #查看IP地址 ifconfig #查看IP地址 dmidecode -s system-product-name #查看服务器是虚拟机还是物理机 cat /proc/version #查看版本信息 cat /etc/…

RPA机器人与传统自动化解决方案的差异性

当前&#xff0c;数字化转型是大势所趋&#xff0c;不少企业在应用传统自动化改造时&#xff0c;由于受到资金、技术、冗杂的流程或者系统集成的限制&#xff0c;投入产出比不甚理想。随着新技术和自动化的升级发展&#xff0c;RPA数字员工为企业数字化转型提供了一套更加简单高…

C++设计模式_20_Composite 组合模式

Composite 组合模式和后面谈到的Iterator&#xff0c;Chain of Resposibility都属于“数据结构”模式。Composite 组合模式核心是通过多态的递归调用解耦内部和外部的依赖关系。 文章目录 1. “数据结构”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义4. Composite 组合模…

vscode在新窗口打开文件夹

点击左槐娃下角中更多设置选项 VS Code怎么设置在上的新窗口中打开文件夹 2 弹出了下拉蚂阅菜单选择settings选项 VS Code怎么设置在上的新窗口中打开文件夹 3 点击左侧中new widow选项 VS Code怎么设置在上的新窗口中打开文件夹 4 点击open folders in new window选项 VS …

Springmvc 讲解(1)

文章目录 前言一、SpringMvc1、简介2、核心组件和调用流程2.1 涉及组件的理解 3、小案例快速体验3.1场景需求3.1.1 导入依赖3.1.2 controller声明3.1.3 核心配置类3.1.4 环境搭建3.1.6 配置tomcat3.1.7 测试 二、SpringMvc 接收参数1.路径设置注解2、param接收参数四种类型2.1 …