html,css,js实现电子点名绘制和下载

场景:

公司申请vpn网络,需要提交一个pdf,有电子签名。我们可以手写拍照,然后借助ps或者wps对图片进行处理,抠出名字,背景设为透明,但是这样似乎很麻烦,而且对于没有这两个软件操作经验的小白来说还是有点困难的。

我想,最终我们是要得到一张图片的嘛,那么js是可以通过canvas生成图片的,那么不如用canvas做一个可以生成电子签名的程序。

实现思路:

1、有一张画布,有两个按钮,一是导出,而是清除画布

2、获取画布的上下文对象,绑定鼠标事件。鼠标按下时,在移动的过程中去绘制线,鼠标抬起的时候停止绘制。

代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>签名</title>
    <style>
        #cvs {
            border: 1px solid #000;
            width: 640px;
            height: 400px;
            position: absolute;
            top:0;
            left:0;
            z-index:-1;
        }
    </style>
</head>

<body>
    <!-- <div>123</div> -->
    <canvas id="cvs" width="640" height="400"></canvas>
    <button id="btn1">下载</button>
    <button id="btn2">清除</button>
</body>
<script>

    // 获取canvas 实例
    this.cvs = document.getElementById('cvs');
    //获取Context对象(渲染实例)
    this.ctx = this.cvs.getContext('2d');


    // const image = new Image()
    // // 2 引入图片
    // image.src = './huge.jpg'
    // // image.crossOrigin = 'Anonymous';
    // // 3 等待图片加载完成
    // image.onload = () => {
    //     // 4 使用 drawImage() 方法渲染图片
    //     this.ctx.drawImage(image, 0, 0, 640, 400)
    // }
    console.log(this.ctx)


    this.cvs.addEventListener('mousedown', e => {
        this.isDrawing = true;
        this.ctx.moveTo(e.pageX, e.pageY)
    });
    //鼠标移动事件
    this.cvs.addEventListener('mousemove', e => {
        if (this.isDrawing) {
            this.ctx.lineTo(e.pageX, e.pageY);
            this.ctx.stroke();
        }
    });
    //鼠标抬起事件
    this.cvs.addEventListener('mouseup', e => {
        this.isDrawing = false;
        // 结束绘制
    });

    document.getElementById('btn1').addEventListener('click', () => {
        console.log('点击了下载按钮')
        this.cvs.toBlob(function (blob) {
            const date = Date.now().toString()
            // 创建一个 a 标签
            const a = document.createElement('a')
            // 设置 a 标签的下载文件名
            a.download = date + '.png'
            // 设置 a 标签的跳转路径为 文件流地址
            a.href = URL.createObjectURL(blob)
            // 手动触发 a 标签的点击事件
            a.click()
            // 移除 a 标签
            a.remove()
        }, 'image/png');
    })
    document.getElementById('btn2').addEventListener('click', () => {
        this.ctx.clearRect(0, 0, 800, 1000)
        //只清除之后下次写会显现之前的内容,所以要把路径消除
        this.ctx.beginPath();
    })


</script>

</html>

效果图:

导出后效果:

相关推荐
软件开发技术深度爱好者1 小时前
小学英语单词魔法学园HTML5实现
javascript·html5·英语学习
勉灬之1 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
糖果店的幽灵1 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
这是个栗子1 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
Revolution613 小时前
一段 JavaScript 代码执行时,到底发生了什么
前端·javascript
To_OC12 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC14 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn14 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜15 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿15 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage