H5 Canvas 签名

本文介绍了一个简单的HTML5页面,使用CanvasAPI实现画笔绘制、重置功能,并提供一个按钮用于将画布内容保存为图片。代码展示了如何监听鼠标和触屏事件,以及如何将Base64编码的图像转换为Blob对象以便下载。
摘要由CSDN通过智能技术生成

一个比较简单的示例,仅实现了画笔绘制、重置、保存图片功能。
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./assets/global.css">


    <style>
        #drawingBoard {
            width: 100vw;
            height: 90vh;
        }

        #drawingBoardTips {
            position: absolute;
            top: 0;
            width: 100vw;
            height: 90vh;
            pointer-events: none;
            font-size: 28px;
            text-align: center;
            line-height: 90vh;
            color: #999;
            border: 2px dashed #999;
            box-sizing: border-box;
        }

        button {
            border: none;
            padding: 0px 20px;
            line-height: 30px;
            background-color: #e8e8e8;
            white-space: nowrap;
        }

        button:active {
            opacity: .7;
        }
    </style>
</head>

<body>
    <canvas id="drawingBoard"></canvas>
    <div id="drawingBoardTips">
        按住鼠标左键进行绘制
    </div>
    <div>
        <button id="resetBtn">重绘</button>
        <button id="saveBtn">保存</button>
    </div>
    <script type="module">
        /** @type {HTMLCanvasElement} */
        let canvas = document.querySelector("#drawingBoard")
        let ctx = canvas.getContext('2d')
        let width = canvas.clientWidth;
        let height = canvas.clientHeight;
        canvas.width = width;
        canvas.height = height;

        // 画笔设置
        ctx.strokeStyle = "rgb(0,0,0)" // 设置颜色
        ctx.lineWidth = 3 // 设置粗细
        ctx.lineJoin = "round" // 柔和点

        // 电脑
        // canvas.addEventListener("mousemove", (ev) => {
        //     if (ev.buttons == 1) {
        //         ctx.lineTo(ev.offsetX, ev.offsetY)
        //         ctx.stroke()
        //     }
        // })

        // canvas.addEventListener("mouseup", (ev) => {
        //     ctx.beginPath();
        // })


        // 手机
        canvas.addEventListener("touchmove", (ev) => {
            let { clientX, clientY } = ev.touches[0]
            ctx.lineTo(clientX, clientY)
            ctx.stroke()
        })
        canvas.addEventListener("touchend", (ev) => {
            ctx.beginPath();
        })

        document.querySelector('#resetBtn').addEventListener("click", (ev) => {
            ctx.clearRect(0, 0, width, height)
        })

        document.querySelector('#saveBtn').addEventListener('click', (ev) => {
            let a = document.createElement('a');
            a.href = window.URL.createObjectURL(base64ToBlob(canvas.toDataURL()));
            a.setAttribute('download', '个人签名.png');
            a.click();
        })

        // base64 转 Blob
        function base64ToBlob(base64) {
            let arr = base64.split(',');
            let mime = arr[0].match(/:(.*?);/)[1];
            let bstr = atob(arr[1]);
            let n = bstr.length;
            let u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], { type: mime })
        }
    </script>


</body>

</html>

在线预览
https://linyisonger.github.io/H5.Examples/
源码仓库
https://github.com/linyisonger/H5.Examples.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林一怂儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值