资讯专栏INFORMATION COLUMN

基于canvas剪辑区域功能实现橡皮擦效果

hidogs / 2642人阅读

摘要:这篇文章主要介绍了基于剪辑区域功能实现橡皮擦效果非常不错,具有参考借鉴价值,需要的朋友可以参考下这是基础结构没什么好说的下面是重点的这里有个坑要十分注意调用方法的时候,所定义的剪辑区域总是局限于期初的那个剪辑区域范围。

这篇文章主要介绍了基于canvas剪辑区域功能实现橡皮擦效果,非常不错,具有参考借鉴价值,需要的朋友可以参考下

这是基础结构 没什么好说的

?


  
  
  
  Document
  


    
Stroke color: Fill color: 582735936 Draw Erase Eraser: 582735936 Eraser width:

下面是重点的js

这里有个坑要十分注意 调用clip()方法的时候,所定义的剪辑区域总是局限于期初的那个剪辑区域范围。

简单来说 clip()方法总是在上一次的剪辑区域基础上进行操作,所以说我们要把clip()方法放在save()和restore()方法中

var canvas = document.getElementById("canvas"),
context = canvas.getContext("2d"),
strokeStyleSelect = document.getElementById("strokeStyleSelect"),  //画图的描边颜色
fillStyleSelect = document.getElementById("fillStyleSelect"),    //画图填充颜色
drawRadio = document.getElementById("drawRadio"),          //画图按钮
eraserRadio = document.getElementById("eraserRadio"),       //橡皮擦按钮 
eraserShapeSelect = document.getElementById("eraserShapeSelect"), //橡皮擦形状
eraserWidthSelect = document.getElementById("eraserWidthSelect"), //橡皮擦宽度
ERASER_LINE_WIDTH = 1,
drawingSurfaceImageData,
lastX,
lastY,
mousedown = {},
rubberbandRect = {},
dragging = false
function windowToCanvas(x,y){ //这个函数的作用是捕捉鼠标点在canvas上的坐标
  var bbox=canvas.getBoundingClientRect()
  return {
    x:x-bbox.left,
    y:y-bbox.top
  }
}
function saveDrawingSurface(){  //这个函数的作用是初始化读取画布信息并储存起来
  drawingSurfaceImageData=context.getImageData(0,0,canvas.width,canvas.height)
}
function restoreDrawingSurface(){ //这个函数的作用是读取画布信息
  context.putImageData(drawingSurfaceImageData,0,0)
}
function drawGrid(){ //这个函数的作用是填充进橡皮擦的剪辑区域
  context.save()
  context.fillStyle="#fff"
  context.fillRect(0,0,canvas.width,canvas.height)
  context.restore()
}
function drawrubber(x,y){
  context.beginPath()
  context.arc(x,y,eraserWidthSelect.value,0,Math.PI*2,false)
  context.clip()   582735936
}
function drawCri(x,y){
  var x_width=Math.abs(x-mousedown.x)
  var y_width=Math.abs(y-mousedown.y)
  var radius=Math.sqrt(x_width*x_width+y_width*y_width)
 context.save()
  context.beginPath()
  context.fillStyle=fillStyleSelect.value;
  context.arc(mousedown.x,mousedown.y,radius,0,Math.PI*2,false)
  context.fill()
 context.restore()
}
canvas.onmousedown=function(e){
  var loc=windowToCanvas(e.clientX,e.clientY)
  mousedown.x=loc.x
  mousedown.y=loc.y
  lastX=loc.x
  lastY=loc.y
  saveDrawingSurface()
  dragging=true
}
canvas.onmousemove=function(e){
  if(dragging){
    var loc=windowToCanvas(e.clientX,e.clientY)
    if(drawRadio.checked){ //如果是画图状态
      // 
      restoreDrawingSurface()
      drawCri(loc.x,loc.y)
    }else{ //如果是橡皮擦状态
      context.save()
      drawrubber(loc.x,loc.y)
      drawGrid()
      context.restore()
    }
  }
}
canvas.onmouseup=function(e){
  dragging=false;
  var loc=windowToCanvas(e.clientX,e.clientY)
  if(drawRadio.checked){
  lastX=loc.x;
  lastY=loc.y;
  restoreDrawingSurface()
  drawCri(lastX,lastY)
  }else{
  context.save()
  drawrubber(loc.x,loc.y)
  drawGrid()
  context.restore()
  }
}

总结

以上所述是小编给大家介绍的基于canvas剪辑区域功能实现橡皮擦效果,希望对大家有所帮助

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99354.html

相关文章

  • 使用Canvas和JavaScript做一个画板

    摘要:本文同步于个人博客前些天学习了的元素,今天就来实践一下,用做一个画板。实现一个简单的画板实现思路监听鼠标事件,用方法把记录的数据画出来。为时,移动鼠标使用剪裁擦除画布。 本文同步于个人博客:https://zhoushuo.me/blog/2018/03/11/drawing-borad/ 前些天学习了HTML5的元素,今天就来实践一下,用canvas做一个画板。 showImg(ht...

    asce1885 评论0 收藏0
  • Canvas画板---手机上也可以用的画板

    摘要:方法可以获取到上下文二制作画板画板功能可以绘制不同颜色和粗细的线条,画板上有橡皮擦功能,一键清除功能,下载功能。我们可以用来监听三种状态。 学习制作画板之前,我们先来了解一下canvas标签 一.canvas标签 1.canvas标签与img标签相似,但是canvas标签是一个闭合标签,并且没有src alt属性2.canvas标签有两个属性,width,height。我们在页面上用c...

    oogh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<