前端实现手写签名

1.canvas实现手写签名

目前项目需求为签名在一张图片上,使用canvas就需要先把图片渲染在画板上,然后根据鼠标移动事件连接点位从而组成签名,最后导出为图片。

初始化

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

图片引入和加载

const image = new Image()
// 2 引入图片
image.src = '图片地址'
// 3 等待图片加载完成
image.onload = () => {
// 4 使用 drawImage() 方法渲染图片
this.ctx.drawImage(image, 0, 0,800,1000)
}
/*
    drawImage(image, dx, dy, dw, dh)
    image: 要渲染的图片对象。
    dx: 图片左上角的横坐标位置。
    dy: 图片左上角的纵坐标位置。
    dw 用来定义图片的宽度,dh 定义图片的高度。
*/

鼠标移动时绘制

使用的是一个开关,确定鼠标按下才能监听移动,移动时进行添加线条和绘制,鼠标抬起时关闭开关,不再绘制

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;
           // 结束绘制
        });

保存图片并下载

 this.cvs.toBlob(function(blob){
                const date = Date.now().toString()
                // 创建一个 a 标签
                const a = document.createElement('a')
                // 设置 a 标签的下载文件名
                a.download = `aaa.png`
                // 设置 a 标签的跳转路径为 文件流地址
                a.href = URL.createObjectURL(blob)
                // 手动触发 a 标签的点击事件
                a.click()
                // 移除 a 标签
                a.remove()
                }, 'image/png');

toBlob 方法将画布绘制的图像转换为 blob

注意canvas被污染

基于同域的安全协议,canvas里只要绘制了一张其他域的图片,就会变成"脏"画布,将不能使用toBlob,toDataURL输出内容.除非引入的图片在其服务器上是允许跨域的,可以使用

image.crossOrigin = 'Anonymous';

清除当前画布内容

this.ctx.clearRect(0, 0, 800, 1000)
//只清除之后下次写会显现之前的内容,所以要把路径消除
this.ctx.beginPath();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值