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

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

?

Document

*{padding: 0;margin: 0}

a{text-decoration: none}

img{border: none}

ul,ol{list-style: none}

br{font-size: 0;line-height: 0;font-size: 0}

canvas{border: 1px solid red;background: white}

body{background: gray;text-align: center}

Stroke color:

red

green

blue

orange

cornflowerblue

goldenrod

navy

purple

purple

Fill color:

semi-transparent red

green

semi-transparent blue

orange

semi-transparent cornflowerblue

goldenrod

navy

purple

582735936

Draw

Erase

Eraser:

circle

square

582735936

Eraser width:

25

50

75

100

125

150

175

200

下面是重点的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.οnmοusedοwn=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.οnmοusemοve=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.οnmοuseup=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剪辑区域功能实现橡皮擦效果,希望对大家有所帮助

java做橡皮擦效果_基于canvas剪辑区域功能实现橡皮擦效果相关推荐

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

    这篇文章主要介绍了基于canvas剪辑区域功能实现橡皮擦效果,非常不错,具有参考借鉴价值,需要的朋友可以参考下 这是基础结构 没什么好说的 ?<!DOCTYPE html> <htm ...

  2. vue和Java做数据交互_基于vue和springmvc前后端分离,json类接口调用介绍

    基于vue和springmvc前后端分离,json类接口调用介绍 版本要求:spring-3.2.9.RELEASE.vue-2.9.2.axios-0.17.1,其中axios作为http clie ...

  3. java做同学录管理系统_基于jsp的同学录管理系统-JavaEE实现同学录管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的同学录管理系统, 该项目可用各类java课程设计大作业中, 同学录管理系统的系统架构分为前后台两部分, 最终实现在 ...

  4. 用Java做手机备忘录_基于安卓Android的手机备忘录设计(AndroidStudio)

    基于安卓Android的手机备忘录设计(AndroidStudio)(论文11300字,程序代码) 摘要:互联网技术和智能手机的普及,使人们接收到的信息变得越来越碎片化和多元化,人脑很难一一记下自己所 ...

  5. 利用java做前端连接数据库_基于java的前端与数据库的交互

    在之前很长一段时间都在搞前端部分,然后又大概了解了下数据库,现在想着把二者交融在一起吧-- 首先我在Eclipse中的布局是这样的,也不知道合不合理: 用到了四个文件,分别是用于用户输入信息的前端界面 ...

  6. 用Java做手机备忘录_基于安卓Android的备忘录系统APP的设计(Eclipse)

    基于安卓Android的备忘录系统APP的设计(Eclipse)(任务书,开题报告,论文13000字,程序代码) 摘要 随着移动互联网的高速发展,智能手机的使用已经普及.为了能让智能手机发挥更大的应用 ...

  7. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  8. java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言

    点赞是一个互动性很强的功能,网站加入点赞可以增强用户之间的亲密度,可以利用点赞排出受欢迎文章或者其他的列表,所以今天教大家如何做一个类似于微博.QQ空间的点赞功能 需求分析: 首先要明确这个功能是需要 ...

  9. canvas换图时候会闪烁_基于Canvas实现的高斯模糊(上)「JS篇」

    作者:iNahoo 转发链接:https://mp.weixin.qq.com/s/5TxPjznpEBku_ybSMBdnfw 目录 基于Canvas实现的高斯模糊(上)「JS篇」本篇 基于Canv ...

最新文章

  1. Codeforces 337D Book of Evil:树的直径【结论】
  2. mysql 运行 sql 脚本
  3. 成功解决.sh: line 6: syntax error near unexpected token `do
  4. Python学习心得(二) : 更新列表
  5. java 的toString()函数
  6. SAP Spartacus buildCmsStructure 构建逻辑
  7. 打印管理 php,window_强化Windows Server 2008下的打印管理,  打印管理从来都是Windows Se - phpStudy...
  8. github可以刷星吗_GitHub 没有 star,该写进简历里吗?
  9. 怎样快速的学习微信小程序
  10. libusb-win32
  11. Python下的中文分词实现
  12. 基于 element ui 之 ui-tooltip 组件
  13. 浅析帧、帧数、帧率、FPS区别
  14. 二十余岁时的社会观(一)
  15. Scala隐式转换的问题分析--String隐式转换为Int
  16. 初识Mongdb之数据查询篇(二)
  17. 程序员编程艺术第一 三十八章集锦与总结,及Github地址 PDF下载
  18. CocoStudio UI 编辑器的使用
  19. 矩阵基础知识------秩+线性相关和线性无关
  20. RENIX_802.3ah功能介绍(下)——网络测试仪实操

热门文章

  1. visio 2013 如何制作形状的剪切、联合、组合、拆分、相交、剪除功能
  2. linux网卡设置详细
  3. Ubuntu22.04-添加中文输入法
  4. kali linux 安装qq 详细操作
  5. 【珍藏版】VirtualBox虚拟机安装Windows10,妈妈看了都会说好丝滑~
  6. SpringBean生命周期的理解
  7. 自己实现FFT--matlab版本
  8. 用JS任意控制手机上的APP
  9. 设备兼容性 -Device Compatibility
  10. 语句覆盖、判定覆盖、条件覆盖 - 白盒笔试题解析