canvas制作在线画板

2023-11-16

上效果图

 

<template>
  <canvas ref="canvas" class="canvas" width="800" height="600"></canvas>
  <hr />
  <button id="boldBtn" type="button" ref="boldBtn" @click="boldBtn_click">
    粗线条
  </button>
  <button id="thinBtn" type="button" ref="thinBtn" @click="thinBtn_click">
    细线条
  </button>
  <button id="saveBtn" type="button" ref="saveBtn" @click="saveBtn_click">
    保存签名
  </button>
  <input
    type="color"
    name=""
    id="color"
    value=""
    ref="color"
    @input="colorChnage"
  />
  <button id="clearBtn" ref="clearBtn" @click="clearBtn_click">橡皮擦</button>
  <button id="nullBtn" ref="nullBtn" @click="nullBtn_click">清空画布</button>
</template>

<script setup lang="ts">
import { ref, onMounted, reactive, Ref } from 'vue'
//1.获取画布和上下文对象
const canvas = ref<HTMLCanvasElement | null>(null)
let ctx = reactive<any>(null)
//2.获取输入框和按钮
//设置画笔的粗细:粗
const boldBtn = ref()
//设置画笔的粗细:细
const thinBtn = ref()
//保存签名
const saveBtn = ref()
//签名颜色选择
const color = ref()
//橡皮擦按钮
const clearBtn = ref()
//清空画布
const nullBtn = ref()
//设置允许绘制的变量
let isDraw = false

const initContext = () => {
  if (canvas.value?.getContext) {
    ctx = canvas.value.getContext('2d')
    //画笔线条圆润
    ctx.lineJoin = 'round'
    ctx.lineCap = 'round'
  }
}

const mouseListner = () => {
  //获取鼠标落下点的位置,将画笔移动到该处
  canvas.value!.onmousedown = (e) => {
    isDraw = true
    ctx.beginPath()
    let x = e.pageX - canvas.value!.offsetLeft
    let y = e.pageY - canvas.value!.offsetTop
    ctx.moveTo(x, y)
    //console.log(x, y)
  }
  canvas.value!.onmousemove = (e) => {
    if (isDraw) {
      let x = e.pageX - canvas.value!.offsetLeft
      let y = e.pageY - canvas.value!.offsetTop
      ctx.lineTo(x, y)
      ctx.stroke()
    }
  }
  //鼠标离开画布结束绘画
  canvas.value!.onmouseleave = () => {
    isDraw = false
    ctx.closePath()
  }
  //鼠标弹起结束绘画
  canvas.value!.onmouseup = () => {
    isDraw = false
    ctx.closePath()
  }
}

const boldBtn_click = () => {
  ctx.globalCompositeOperation = 'source-over'
  ctx.lineWidth = 20
  addClassStyle(boldBtn.value)
}

const thinBtn_click = () => {
  ctx.globalCompositeOperation = 'source-over'
  ctx.lineWidth = 2
  addClassStyle(thinBtn.value)
}

const saveBtn_click = () => {
  let urlData: string | undefined = canvas.value!.toDataURL()
  // let image: HTMLImageElement | undefined = new Image()
  // image.src = urlData
  // document.body.appendChild(image)

  let downloadA = document.createElement('a')
  downloadA.setAttribute('download', '炫酷签名')
  downloadA.href = urlData
  downloadA.click()
}

const clearBtn_click = () => {
  ctx.globalCompositeOperation = 'destination-out'
  ctx.lineWidth = 30
  addClassStyle(clearBtn.value)
}

const nullBtn_click = () => {
  ctx.clearRect(0, 0, 800, 600)
  addClassStyle(nullBtn.value)
}

const addClassStyle = (thisBtn: any) => {
  boldBtn.value.classList.remove('active')
  thinBtn.value.classList.remove('active')
  clearBtn.value.classList.remove('active')
  nullBtn.value.classList.remove('active')
  thisBtn.classList.add('active')
}

const colorChnage = () => {
  //console.log(color.value.value)
  ctx.strokeStyle = color.value.value
}


onMounted(() => {
  initContext()
  mouseListner()
})
</script>

<style lang="less" scoped>
.canvas {
  border: 1px solid black;
  z-index: 10;
}
button.active {
  color: #fff;
  background-color: orange;
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

canvas制作在线画板 的相关文章

随机推荐

  • 一个码稿人自述:什么样的文档产品适合我?|深度吐槽

    关注ITValue 看企业级最新鲜 最价值报道 图片来源 Unsplash 钛媒体打工人 媒体相关从业经验4 5年 文档使用重度患者 今天以我曾经用过的 和现在主流的一些文档产品为例 来谈谈我的使用体验 以及什么样的文档适合我 一 我与文档
  • [编程工具]MarkDown编辑查看以及使用语法

    目录 0 前言 1 markDown语法 2 markDown 3 MD正确打开方式 4 结尾 结束啦感谢观看 5 参考连接 0 前言 本文介绍了markDown的编辑查看 使用浏览器查看以及Vscode中查看编辑MD 最后介绍了MD的常用
  • python解析佳明fit文件

    使用 fitparse 解析 佳明 fit 文件 以下示例测试环境为 python 3 8 fitparse 1 2 fitparse 安装 pip3 install fitparse 使用方式 import fitparse from d
  • 蓝牙通讯

    蓝牙通讯 简介 蓝牙API 所需权限 使用蓝牙的步骤 普通调用案例 通讯案例 简介 蓝牙 是一种支持设备短距离通信 一般10m内 且无阻隔媒介 的无线电技术 能在包括移动电话 PDA 无线耳机 笔记本电脑等众多设备之间进行无线信息交换 利用
  • 数据库创建索引和删除索引的方式总结

    一 创建索引 1 1 使用Alter创建索引 1 添加主键索引 特点 数据列不允许重复 不能为null 一张表只能有一个主键 Mysql主动将该字段进行排序 ALTER TABLE 表名 ADD Primary key col 2 添加唯一
  • MySQL安装与启动

    1 MySQL安装包下载 下载地址 https dev mysql com downloads mysql 这里我的电脑是WIN764位的 大家根据自己的电脑自己选择要下载的包 2 解压安装 解压后进入到Windows的DOS命令行下 切换
  • python股票量化交易系统_利用python建立股票量化交易系统(一)

    从今天开始正式开启我的博客之旅 博客内容全部是我自己的量化心得 主要还是为自己将来中工作之中遇到相似问题 可以方便的找到答案 如果能帮到有相似问题的其他同学 我也很开心 如果帮不到的话 不喜勿喷 如果文章中有什么不对的地方 欢迎批评指正 建
  • VI编辑器的使用常用快捷方式编辑命令

    VI编辑器的使用常用快捷方式编辑命令 一 VI编辑器的工作模式 1 VI编辑器有以下三种工作模式 命令模式 输入模式 末行模式 2 不同模式之间的切换 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 7BrI0o
  • 【LInux】基础开发工具的使用

    文章目录 一 Linux的应用市场 yum 1 什么是yum 2 为什么要有yum 3 如何使用yum 3 1 前提条件 3 2 搜索软件 3 3 安装软件 3 4 卸载软件 二 Linux的文本编辑器 vim 1 什么是vim 2 为什么
  • Java中的线程

    一 程序 进程 线程之间的关系 程序 进程和线程是计算机中重要的概念 它们描述了不同层次上的执行和管理方式 程序是指由一系列指令组成的代码文件 它定义了算法和逻辑 用来解决特定的问题 程序本身是静态的 只有在被加载到内存并被操作系统调度执行
  • SSM框架(Spring+SpringMVC+MyBatis)

    SSM Spring SpringMVC MyBatis 框架集由Spring SpringMVC MyBatis三个开源框架整合而成 常作为数据源较简单的web项目的框架 Spring是一个开源框架 Spring是于2003 年兴起的一个
  • 思科CISCO常用命令汇总

    视图模式介绍 1 普通视图router gt 2 特权视图router 在普通模式下输入enable 3 全局视图router config 在特权模式下输入configt 4 接口视图router config if 在全局模式下输入in
  • ASN.1的一些理解

    为什么要有ASN 1这个东西 我们知道 像C Java这种高级语言 对于计算机来说都要转化为二进制代码才能识别和操作 这就涉及到序列化和反序列化这两个概念 将一个对象序列化成二进制代码 就可以保存成文本或者利用网络传输到远程 与序列化相对的
  • 2021-02-23(亚马逊服务存储桶)

    亚马逊云服务器测试情况 需要外网 国际 才能登录 网址 https 956438185477 signin aws amazon com console 国际短信的话 在右上角区域区域选择弗吉尼亚北部 左边选择sms短信服务 视频加速要用到
  • 13.openssl编程——ASN1库

    13 1 ASN1 简介 ANS 1 Abstract Syntax Notation One X 208 是一套灵活的标记语言 他允许定义多种数据类型 从integer bit string 一类的简单类型到结构化类型 如set和sequ
  • LeetCode-链表中倒数第k个节点

    单链表只能从前往后遍历 所以 我们可以先计算出链表长度 倒数第k个节点相当于正数第n k 1个节点 然后我们再从头往后找 找到第n k 1个节点就可以了 while循环版 Definition for singly linked list
  • Semaphore 源码分析

    需要提前了解的知识点 AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore 信号量 是用来控制同时访问特定资源的线程数量 它通过协调各个线程 以保证合理的使用公共资源 比如控制用户的访问量 同一时刻只允
  • cesium+vue-cli安装步骤

    1 依赖node所以先安装node 可从官网下载安装 安装一直下一步最后选安装目录 2 win r输入cmd运行 先输入node v和npm v查看node安装是否正常 我这里node是10 5 0 npm是6 1 0 3 安装vue np
  • Log4net等级说明以及按照不同级别写入多个日志文件

    等级说明 Level级别 DEBUG
  • canvas制作在线画板

    上效果图