首页 > 其他分享 >canvas画布有下载功能兼容手机pc端

canvas画布有下载功能兼容手机pc端

时间:2022-12-22 14:24:29浏览次数:44  
标签:canvas const 绘制 ctx 画布 pc client config

这里不啰嗦直接上代码

<!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">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <canvas></canvas>
    <div>
        <button onclick="cancel()">取消</button>
        <button onclick="save()">保存</button>
        <button onclick="color('#fbf66c')" mousedown="color('#fbf66c')"
            style="background-color: #fbf66c; border: #fbf66c;">黄色</button>
        <button onclick="color('#666fff')" mousedown="color('#666fff')"
            style="background-color: #666fff; border: #666fff;">紫色</button>
        <button onclick="color('#389d3d')" mousedown="color('#389d3d')"
            style="background-color: #389d3d; border: #389d3d;">绿色</button>
        <button onclick="color('#e00630')" mousedown="color('#e00630')"
            style="background-color: #e00630; border: #e00630;">红色</button>
        <button onclick="color('#e5ccd1')" mousedown="color('#e5ccd1')"
            style="background-color: #e5ccd1; border: #e5ccd1;">粉色</button>
        <button onclick="color('#ffffff')" mousedown="color('#ffffff')"
            style="background-color: #ffffff; border: #ffffff;">橡皮</button>
        <button onclick="color('#000000')" mousedown="color('#000000')"
            style="background-color: #ffffff; border: #ffffff;">黑色</button>
    </div>
</body>
<script>
    // 配置内容
    const config = {
        width: 1474, // 宽度
        height: 650, // 高度
        lineWidth: 5, // 线宽
        strokeStyle: '#666fff', // 线条颜色
        lineCap: 'round', // 设置线条两端圆角
        lineJoin: 'round', // 线条交汇处圆角
    }
    // 修改颜色
    const color = (val) => {
        config.strokeStyle = val
    }
    // 获取canvas 实例
    const canvas = document.querySelector('canvas')
    // 设置宽高
    canvas.width = config.width
    canvas.height = config.height
    // 设置一个边框
    canvas.style.border = '1px solid #000'
    // 创建上下文
    const ctx = canvas.getContext('2d')

    // 设置填充背景色
    ctx.fillStyle = 'transparent'
    // 绘制填充矩形
    ctx.fillRect(
        0, // x 轴起始绘制位置
        0, // y 轴起始绘制位置
        config.width, // 宽度
        config.height // 高度
    );

    // 保存上次绘制的 坐标及偏移量
    const client = {
        offsetX: 0, // 偏移量
        offsetY: 0,
        endX: 0, // 坐标
        endY: 0
    }

    // 判断是否为移动端
    const mobileStatus = (/Mobile|Android|iPhone/i.test(navigator.userAgent))

    // 初始化
    const init = event => {
        // 获取偏移量及坐标
        const { offsetX, offsetY, pageX, pageY } = mobileStatus ? event.changedTouches[0] : event

        // 修改上次的偏移量及坐标
        client.offsetX = offsetX
        client.offsetY = offsetY
        client.endX = pageX
        client.endY = pageY

        // 清除以上一次 beginPath 之后的所有路径,进行绘制
        ctx.beginPath()
        // 根据配置文件设置相应配置
        ctx.lineWidth = config.lineWidth
        ctx.strokeStyle = config.strokeStyle
        ctx.lineCap = config.lineCap
        ctx.lineJoin = config.lineJoin
        // 设置画线起始点位
        ctx.moveTo(client.endX, client.endY)
        // 监听 鼠标移动或手势移动
        window.addEventListener(mobileStatus ? "touchmove" : "mousemove", draw)
    }
    // 绘制
    const draw = event => {
        // 获取当前坐标点位
        const { pageX, pageY } = mobileStatus ? event.changedTouches[0] : event
        // 修改最后一次绘制的坐标点
        client.endX = pageX
        client.endY = pageY

        // 根据坐标点位移动添加线条
        ctx.lineTo(pageX, pageY)

        // 绘制
        ctx.stroke()
    }
    // 结束绘制
    const cloaseDraw = () => {
        // 结束绘制
        ctx.closePath()
        // 移除鼠标移动或手势移动监听器
        window.removeEventListener("mousemove", draw)
    }
    // 创建鼠标/手势按下监听器
    window.addEventListener(mobileStatus ? "touchstart" : "mousedown", init)
    // 创建鼠标/手势 弹起/离开 监听器
    window.addEventListener(mobileStatus ? "touchend" : "mouseup", cloaseDraw)

    // 取消-清空画布
    const cancel = () => {
        // 清空当前画布上的所有绘制内容
        ctx.clearRect(0, 0, config.width, config.height)
    }
    // 保存-将画布内容保存为图片
    const save = () => {
        // 将canvas上的内容转成blob流
        canvas.toBlob(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()
        })
    }
</script>

</html>

 

标签:canvas,const,绘制,ctx,画布,pc,client,config
From: https://www.cnblogs.com/tcyweb/p/16998562.html

相关文章

  • Vue给Element UI的el-popconfirm绑定按钮事件
     我翻遍了饿了么的帮助文档居然没有找到上图popconfirm控件中“确定”按钮如何绑定事件,这里给出具体的方案<el-popconfirmtitle="确定关闭浏览器吗?"icon="......
  • HttpClient mock
    HowtoMockHttpClientwithUnitTestsinC#-CodeMaze(code-maze.com) MockingHTTPrequestsforunittestingisimportantbecauseoftheprevalenceofAP......
  • [echarts] 图表网站 ppchart made a pie
    MakeAPie是由社区贡献者维护的用于ApacheECharts作品分享的第三方非官方社区。平时做Echarts图表经常需要用到,近期官方已经关闭,找到以下几个可替代的网站。(MakeAPie......
  • PCB五大过孔工艺(转载自PCB论坛---避雷针)
    1.过孔盖油过孔盖油的“油”指的是阻焊油,过孔盖油就是把过孔的孔环用阻焊油墨盖住。过孔盖油的目的的是绝缘,所以必须保证孔环的油墨盖全且足够厚,这样后期在贴片和DIP时都......
  • WAVE绘制频谱图(二)——WAVE文件解析提取PCM数据
    {https://blog.csdn.net/qq_36568418/article/details/91530563?spm=1001.2014.3001.5502}{为了不太多依赖于平台环境,音频数据提取部分尽量都用c++实现。话不多说,直接......
  • ibatis后台通过SqlMapClient获取sql语句
    Stringsql="";SqlMapClientImplsqlmap=(SqlMapClientImpl)getSqlMapClient();MappedStatementstmt=sqlmap.getMappedStatement("UupmUser.selectUsersPgnCountByC......
  • 【PCB设计】孔间距不可忽视,小心废板!
    为什么有时候明明PCB设计没有检查出错误,但是在生产加工后还是出现短路、断板等不良情况?那是因为你没有考虑到孔间距问题,导致在装配过程中无法避免的产生损耗。PCB单面板或双......
  • Go/Python 基于gRPC传输图片
    python程序作为服务端,Go程序作为客户端,基于gPRC进行通信客户端定义proto文件:syntax="proto3";optiongo_package=".;transfer";serviceGreeter{rpcSendI......
  • Wallys//AX200NGW,adapter card with one M.2 slot/DR2g41 Linux,WiFi-modules,4-mini
    DR3g11//1xM.2Card,QCN9074,AX200NGWAdapterCardsupportDR9074-6E DR2g41//Linux,WiFi-modules,4-miniPCIE-slotAdapterCard4xMiniPCIeCard4xM.2Ca......
  • 关于SqlMapConfig.xml
    1、引入外部propertiesdb.properties必须在类路径下<propertiesresource="db.properties"><!--<propertyname="driver"value="com.mysql.jdbc.Driver"/>......