页面手写签名实现:利用Canvas技术将签名保存为图片

简介: 页面手写签名实现:利用Canvas技术将签名保存为图片

前言

Canvas 是 HTML5 中新增的一个元素,它是一个画布,可以用 JavaScript 在网页上绘图。Canvas 是 2D 绘图 API 的一部分,可以用于绘制图形、文字、图片等。与 SVG 不同,Canvas 是基于位图的,不能直接在上面进行复杂的几何运算,而 SVG 则是基于矢量的,可以绘制复杂的几何图形。


使用 Canvas 绘图需要先创建一个 Canvas 对象,然后获取它的 2D 上下文对象,通过这个对象来进行绘图操作。Canvas 的坐标系与 SVG 不同,它的原点在左上角,x 轴向右延伸,y 轴向下延伸。可以使用 Canvas 提供的方法来绘制各种图形,包括直线、矩形、圆形、多边形等。


除了 2D 绘图之外,Canvas 还支持 3D 绘图,可以通过 WebGL API 来实现。WebGL 是基于 OpenGL ES 2.0 的,可以在 Canvas 上实现 3D 图形渲染。使用 WebGL 可以创建更加复杂的三维效果,例如游戏、模拟器等。


Canvas 是 HTML5 中新增的一个重要功能,它提供了一个在网页上绘图的方法,可以用于创建各种图形、动画和游戏等。

html部分

添加一个canvas元素,并设置id属性,设置好尺寸大小,然后添加两个按钮,取消和确定。

<canvas id="canvas" width="800" height="600"></canvas>
<button onclick="reset();">取消</button>
<button onclick="savePic()">确定</button>

js部分

var canvas = document.getElementById('canvas');
canvas.width = '800';
canvas.height = '600';
var ctx = canvas.getContext('2d');
ctx.lineWidth = 2; //直线的宽度状态设置
ctx.fillStyle = "#ffffff"; //直线的颜色状态设置
ctx.strokeStyle = "#058"; //直线的颜色状态设置
ctx.lineCap = 'round';
ctx.lineJoin = 'round';
ctx.fillRect(0, 0, 800, 600);
let isDown = false
// 鼠标按下
canvas.addEventListener('mousedown', (e) => {
    isDown = true
    ctx.beginPath() //开始路径
    ctx.moveTo(e.offsetX, e.offsetY); //绘制点移动
})
// 鼠标移动
canvas.addEventListener('mousemove', (e) => {
    if (isDown) {
        ctx.lineTo(e.offsetX, e.offsetY); //绘制直线
        ctx.stroke() //描边
    }
})
// 鼠标抬起
document.documentElement.addEventListener('mouseup', (e) => {
    isDown = false
})
// 鼠标经过
canvas.addEventListener('mouseover', (e) => {
    canvas.style.cursor = 'crosshair'
})
// 鼠标离开
canvas.addEventListener('mouseout', (e) => {
    canvas.style.cursor = 'default'
})
// 取消
function reset() {
    ctx.fillRect(0, 0, 800, 600);
}
// 保存图片
function savePic() {
    var link = document.createElement("a");
    var imgData = canvas.toDataURL({
        format: 'png',
        quality: 1,
        width: 1920,
        height: 1080
    });
    var strDataURI = imgData.substr(22, imgData.length);
    var blob = dataURLtoBlob(imgData);
    var objurl = URL.createObjectURL(blob);
    link.download = "canvas.png";
    link.href = objurl;
    link.click();
}
 
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {
        type: mime
    });
}


这样就可以在页面中使用canvas实现手写签名了。当用户在canvas上按下鼠标并移动时,就会开始绘制签名,松开鼠标时则会结束签名。

效果预览

目录
相关文章
|
JavaScript 前端开发
JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存
JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存
788 0
|
7月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
55745 11
|
10月前
|
数据采集 缓存 JSON
GitHub 开源爆款工具|MediaCrawler:程序员零门槛采集抖音/小红书/B站等社交评论,30K star 背后的场景实战揭秘!
MediaCrawler 是一个支持多平台的社交媒体数据爬虫工具,覆盖小红书、抖音、B站等主流平台,提供关键词/ID爬取、评论采集、登录态缓存、代理池等功能,结合 Playwright 实现浏览器模拟,降低逆向难度,适合内容运营、数据分析等场景,开源免费,使用简便。
6262 0
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
3874 1
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
21884 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
|
XML 前端开发 Java
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
1170 0