canvas擦除画的线但不擦除背景

news/2024/7/10 22:50:56 标签: canvas, jquery, js, html5

canvas_0">canvas擦除画的线但不擦除背景

首先html文件中如下写,图片的话,自己随便找一张。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .btn ul{
      list-style: none;
      
    }
    .btn ul li{
      float: left;
      margin-left: 20px;
    }
  </style>
</head>
<body style="background:url(./img/1.jpg)">
  <div>
    <canvas class="board" width="600px" height="300px" style="border:1px solid grey"></canvas>
    <div class="btn">
      <ul>
        <li>
          <button class="pen">画笔</button>
        </li>
        <li>
          <button class="earse">橡皮擦</button>
        </li>
        <li>
          <button class="pre">上一步</button>
        </li>
        <li>
          <button class="next">下一步</button>
        </li>
      </ul>
    </div>
  </div>
  <script src="./js/jQuery.js"></script>
  <script src="./js/index.js"></script>
</body>
</html>

js_45">然后js文件

var width = $('.board').width() //获取画布的宽
var height = $('.board').height()//获取画布的高
var left = $('.board').offset().left//获取画布的左偏移
var top = $('.board').offset().top//获取画布的上偏移
var imgList = []  //用于存储历史记录的数组
var step = -1 //记录的步数
var $board = $('.board')[0] 
var ctx = $board.getContext("2d"); 
var earseFalse = false
var flag = false //标记当前这一步是否结束
// ctx.strokeStyle = 'red'  //设置画笔的颜色
ctx.lineWidth = '5' //设置画笔的粗细
window.onload = function() {
  // 当点击笔时,将画笔颜色置为红色,开始作画
  $('.pen').click(function(){
    ctx.globalCompositeOperation="source-over" //globalCompositeOperation的默认。在目标图像上显示源图像。
    ctx.lineWidth = '5'

    // ctx.globalCompositeOperation="none";
   ctx.strokeStyle = 'black'
  })
  // 当点击橡皮擦时,将画笔颜色置为白色,开始擦除
  $('.earse').click(function(){
    ctx.globalCompositeOperation="destination-out"//在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。

    ctx.strokeStyle = 'white'
    // earseFalse = true
    ctx.lineWidth = '20'
  })
  // 作画时鼠标按下,记录起始坐标
  $('.board').mousedown(function(e){
    // if(earseFalse){
      // clearCanvas() //清空画布
      // var img = new Image()
      // img.src = imgList[step]
      // img.οnlοad= function(){ctx.drawImage(img,0,0)}
    // }
    // console.log(e)
      flag = true
      ctx.beginPath();
      ctx.moveTo(e.clientX-left,e.clientY.top)
  })
  // 鼠标移动过程中,使用stroke连点成线
  $('.board').mousemove(function(e){
    if(flag){
      ctx.lineTo(e.clientX-1,e.clientY-1);
      ctx.stroke()
    }
  })
  // 鼠标释放,关闭绘画路径
  $('.board').mouseup(function(e){
    ctx.closePath()
    history()//当绘画结束时,调用history,保存这一步的历史记录
    flag = false
  })
  // 返回上一操作
  $('.pre').click(function(){
    
    if(step >= 0){
      step--
      clearCanvas() //清空画布
      var img = new Image()
      img.src = imgList[step]
      img.onload= function(){ctx.drawImage(img,0,0)}//从数组中调取历史记录,进行重绘
    }else{
      alert('没有上一步了')
    }
  })
  // 下一步
  $('.next').click(function(){
    if(step<imgList.length-1){
      step++
      clearCanvas() //清空画布
      var img = new Image()
      img.src = imgList[step]
      img.onload = function(){ctx.drawImage(img,0,0)}//重绘
    }else{
      alert('没有下一步了')
    }
  })
  // 清空画板
  function clearCanvas(){
    $('.board').attr('height',height)//重新设置高度,来清空画板
  }
  // 保存历史记录
  function history(){
    step++
    if(step<imgList.length){
      imgList.length = step 
    }
    imgList.push($(".board").get(0).toDataURL())
  }
}

最后说一下globalCompositeOperation的集中属性值代表的意思

  • source-over:默认。在目标图像上显示源图像。
  • source-atop:在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。
  • source-in:在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。
  • source-out :在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。
  • destination-over:在源图像上方显示目标图像。
  • destination-atop:在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示。
  • destination-in:在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。
  • destination-out:在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。
  • lighter:显示源图像 + 目标图像。
  • copy:显示源图像。忽略目标图像。
  • xor :使用异或操作对源图像与目标图像进行组合。

http://www.niftyadmin.cn/n/566010.html

相关文章

Redis 安装、启动、连接、存储和读取数据

1 下载压缩包 下载地址&#xff1a; https://github.com/tporadowski/redis/releases 2 解压redis压缩包&#xff08;无须安装&#xff09; 将压缩包复制到D:\redis路径下解压。 3 启动redis 第一步&#xff0c;在当前地址栏输入cmd&#xff0c;进入cmd窗口。 第二步&#…

前端js、html、css面试题

1、变量赋值可分为三个阶段 创建变量&#xff0c;在内存中开辟空间初始化变量&#xff0c;将变量初始化为undefined真正赋值 2、浏览器的缓存规则或策略 浏览器的缓存规则是在 http 协议头和 html 页面的 meta 标签中定义的。主要分为两部分&#xff1a;强缓存和协商缓存。优…

Spring Boot 配置Redis(缓存数据库)实现保存、获取、删除数据

1 Redis Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; &#xff08;1&#xff09;Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xf…

Java SpringBoot+Redis实现后端接口防重复提交校验

1 Maven依赖 <!--redis缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 阿里JSON解析器 --><dependency><groupId>c…

前端html5+css面试

H5 1、viewport的常见设置有哪些 viewport常常在响应式开发和移动Web开发中使用&#xff0c;它是用来设置视口的&#xff0c;主要是规定视口的宽度、视口的初始缩放值、视口的最小缩放值、视口的最大缩放值等&#xff0c;一个常见的viewport设置如下<meta name"viewp…

Java I/O error while reading input message;Stream closed问题解决

问题描述&#xff1a; org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed 问题分析&#xff1a; 1、request.getInputStream()方法多次调用&#xff0…

前端常见JavaScript面试题

JavaScript 1、谈谈对闭包的理解&#xff0c;闭包的用途&#xff0c;闭包的缺点 闭包是指有权访问另一个函数作用域中的变量的函数它主要用于 设置私有的方法和变量。还可以构建命名空间&#xff0c;以减少全局变量的使用。使用闭包模块化代码&#xff0c;可以减少全局变量的…

IDEA Method breakpoints may dramatically slow down debugging问题解决

问题描述&#xff1a; Method breakpoints may dramatically slow down debugging 问题分析&#xff1a; 1、在方法上打了断点&#xff0c;导致Debug模式下启动很慢或者请求后端接口经常超时。 解决办法&#xff1a; 取消方法上的断点。 第一步&#xff0c;打开Bebug窗口的…