canvas绘制签名并保存
实现签名的三个关键方法:
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>
效果图:
相关文章:
canvas绘制签名并保存
实现签名的三个关键方法: 1.mousedown:当鼠标按下时开始绘制签名。 2.mousemove:鼠标移动时持续绘制。 3.mouseup:鼠标抬起时结束绘制。 html: <div class"setSign"><canvasref"canvas&q…...
Android渲染流程
目录 缓冲区的不同生命周期代表当前缓冲区的状态: 多个源 ViewRootImpl: Android4.0: Android5.0: Android应用程序调用SurfaceFliger将测量,布局,绘制好的Surface借助GPU渲染显示到屏幕上。 一个Acti…...
牛客-【237题】算法基础精选题单-第二章 递归、分治
第二章 递归、分治 递归NC15173 The Biggest Water ProblemNC22164 更相减损术 递归 NC15173 The Biggest Water Problem 简单递归,直接暴力 #include <math.h> #include <stdio.h> #include <algorithm> #include <cstring> #include &…...
leetcode-字符串
1.反转字符串LeetCode344. 20230911 难度为0,此处就不放代码了 注意reverse和swap等一系列字符串函数什么时候该用,记一记库函数 swap可以有两种实现,涨知识了,除了temp存值还可以通过位运算:s[i] ^ s[j]; s[j] ^ s[i…...
多线程---synchronized特性+原理
文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…...
Qt实现卡牌对对碰游戏
效果 闲来无事,实现一个对对碰游戏,卡牌样式是火影动漫。 先上效果: 卡牌对对碰_火影主题 玩法 启动游戏,进入第一关卡,所有卡牌都为未翻开状态,即背面朝上;点击卡牌,则将卡牌翻开…...
【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)
在上一节:【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理) 中,我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了,可以说是一一对应了。 并且,mask的文件,还根据结…...
极米科技H6 Pro 4K、H6 4K高亮定焦版——开启家用投影4K普及时代
智能投影产业经过几年发展,市场规模正在快速扩大。洛图数据显示,预计今年中国投影出货量有望超700万台,2027年达950万台,可见智能投影产业规模将逐渐壮大,未来可期。2023年,投影行业呈现出全新面貌…...
软考系统架构师知识点集锦九:数据库系统
一、考情分析 二、考点精讲 2.1数据库概述 2.1.1数据库模式 (1)三级模式:外模式对应视图,模式(也称为概念模式)对应数据库表,内模式对应物理文件。(2)两层映像:外模式-模式映像,模式-内模式映像;两层映像可以保证数据库中的数据具有较高的…...
IOC课程整理-6 Spring IoC 依赖注入
1 依赖注入的模式和类型 模式 类型 2 自动绑定(Autowiring) 官方定义 “自动装配是Spring框架中一种机制,用于自动解析和满足bean之间的依赖关系。通过自动装配,Spring容器可以根据类型、名称或其他属性来自动连接协作的bean&…...
FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理
FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理 如下图所示,新的机器人开机后提示报警: PRIO-621 设备没有运行 PRIO-622 控制器没有运行 我们首先查看下手册上的报警代码说明,如下图所示, 如下图所示,…...
《动手深度学习》线性回归简洁实现实例
🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…...
国家数据局正式揭牌,数据专业融合型人才迎来发展良机
📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于恒川的日常汇报系列,大家有兴趣的可以看一看 📘相关专栏C语言初阶、C…...
基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】
基于springboot实现休闲娱乐代理售票系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合,利用java技术建设休闲娱乐代理售票系统,实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管理发…...
3.AUTOSAR OS分析(一)
1. AUTOSAR OS诞生背景 在最初接触汽车ECU开发时,提到最多的还是OSEK,比如OSEK NM、OSEK OS等等;而OSEK/VDK操作系统也是最先引入汽车行业;OSEK OS是基于事件触发的操作系统,有以下特性: 固定优先级调度中断处理函数StartOS和StartupHook作为启动阶段的通用接口函数Shutd…...
AB试验(七)利用Python模拟A/B试验
AB试验(七)利用Python模拟A/B试验 到现在,我相信大家理论已经掌握了,轮子也造好了。但有的人是不是总感觉还差点什么?没错,还缺了实战经验。对于AB实验平台完善的公司 ,这个经验不难获得&#…...
Go语言入门-流程控制语句
流程控制 Go语言中有以下几种常见的流程控制语句: 条件语句(Conditional Statements): if语句:用于根据条件执行代码块。else语句:在if条件不满足时执行的语句块。else if语句:用于在多个条件之…...
深入探究ASEMI肖特基二极管MBR60100PT的材质
编辑-Z 在电子零件领域中,肖特基二极管MBR60100PT因其出色的性能和广泛的应用而显得尤为关键。理解其材质不仅有助于我们深入理解其运作原理,也有助于我们做出更合适的电子设计。那么,肖特基二极管MBR60100PT是什么材质呢? 首先,…...
python类模拟“对战游戏”
Game类含玩家昵称、生命值、攻击力(整数),暴击率、闪避率(小数),在魔术方法init定义;attack方法中实现两个Game实例对战模拟。 (本笔记适合初通Python类class的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.py…...
Maven第二章:Maven基本概念与生命周期
Maven第二章:Maven基本概念与生命周期 前言 本章主要内容,介绍Maven基本概念,包括maven坐标含义,命名规则,继承与聚合、了解与理解生命周期,如何通过Maven进行依赖和版本管理。 什么是Maven的坐标…...
PyTorch 2.8镜像部署教程:从零配置到运行Llama3-70B 4bit量化推理完整指南
PyTorch 2.8镜像部署教程:从零配置到运行Llama3-70B 4bit量化推理完整指南 1. 环境准备与快速部署 在开始之前,请确保您的硬件配置满足以下最低要求: 显卡:NVIDIA RTX 4090D 24GB显存内存:120GB以上存储:…...
Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案
Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraf…...
3步解除音乐枷锁:QMCDecode全场景音频解密指南
3步解除音乐枷锁:QMCDecode全场景音频解密指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果…...
保姆级教程:NLI-DistilRoBERTa快速部署与简单调用指南
保姆级教程:NLI-DistilRoBERTa快速部署与简单调用指南 1. 项目概述与核心能力 NLI-DistilRoBERTa是基于DistilRoBERTa模型的自然语言推理(Natural Language Inference)Web服务,专门用于分析两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa模型90…...
别再死记命令了!用EVE-NG模拟器5分钟搞定思科GRE隧道(附OSPF联动配置)
5分钟玩转思科GRE隧道:EVE-NG实战中的高效学习法 第一次在EVE-NG里搭建GRE隧道时,我盯着满屏的命令行发呆——这些配置到底在做什么?为什么tunnel接口要配源和目的地址?OSPF又是怎么和隧道联动的?直到我用Wireshark抓到…...
RustFS集群部署避坑指南:我用Ansible踩过的3个坑及解决方案
RustFS集群部署实战:Ansible自动化中的三大典型问题与深度解决方案 当你在凌晨三点收到集群告警通知时,会不会希望当初的部署方案能更健壮些?作为经历过数十次生产环境部署的老兵,我想分享那些官方文档不会告诉你的实战经验。本文…...
Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索
Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署探索 1. 开箱即用的私有部署方案 Wan2.2-I2V-A14B是一款强大的文生视频开源大模型,专为RTX 4090D 24GB显存环境深度优化。这个私有部署镜像已经内置了完整的运行环境和所有必要组件&#x…...
Genus水平共现网络分析:高效替代OTU的实战指南
1. 为什么需要Genus水平共现网络分析? 做微生物群落研究的朋友们应该都深有体会,OTU/ASV水平的共现网络分析简直就是个时间黑洞。我去年处理一个土壤微生物项目时,2000多个OTU的共现网络跑了整整8个小时,等结果的时候都能看完两集…...
节能模式实战:OpenClaw+GLM-4.7-Flash定时任务调度
节能模式实战:OpenClawGLM-4.7-Flash定时任务调度 1. 为什么需要节能模式 上个月我的电费账单突然暴涨了40%,排查后发现是那台24小时运行的开发机惹的祸。这台机器不仅要跑OpenClaw智能体,还要负载GLM-4.7-Flash模型推理,风扇整…...
百川2-13B-4bits模型精调:解决OpenClaw复杂任务分解难题
百川2-13B-4bits模型精调:解决OpenClaw复杂任务分解难题 1. 问题背景:OpenClaw的复杂任务执行困境 去年冬天,当我第一次尝试用OpenClaw自动化处理一份市场调研报告时,遭遇了令人抓狂的体验。这个看似简单的任务需要完成网页数据…...
