/** @type {HTMLCanvasElement} */ var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); //获取全局变量 var drawShapeObj = { shape:pickShape.value, //形状 color:pickColor.value, //颜色 line:pickLine.value, //线宽 strokeFill:pickStroke.value, //是填充还是描边 clearWidth:pickClear.value //橡皮檫大小 }; //时间委托,更新变量 allStyleBox.addEventListener('change',function(ev){ var target = ev.target, tag = target.getAttribute('tag'); drawShapeObj[tag] = target.value; }) //必须要设置canvas画布大小 canvas.width = document.documentElement.clientWidth;//设置为整个body的宽度 canvas.height = document.documentElement.clientHeight - 70; function DragImg(fn){ this.moving = false; //标记是否在拖动 this.dis = {}; //鼠标点击时坐标点 this.imageData = ''; //绘制完保存canvas图片 canvas.onmousedown = (e)=>{ this.moving = true; this.dis = { x:e.offsetX, y:e.offsetY } } canvas.onmousemove =(e)=>{ if(!this.moving) { return; } // drawShapeObj.shape 形状 // this.common(); this[drawShapeObj.shape](e); // fn && fn.call(e,dis); // this.line(e); // this.rect(e); } canvas.onmouseup = (e)=>{ this.moving = false; // 通过 getImageData() 复制画布上指定矩形的像素数据 this.imageData = ctx.getImageData(0,0,canvas.width,canvas.height); //鼠标松开获取绘制的图片 console.log(this.imageData); } } //公共的处理 DragImg.prototype.common = function(){ //清除画布 ctx.clearRect(0,0,canvas.width,canvas.height); //绘制之前的形状,通过 putImageData() 将图像数据放回画布 this.imageData && ctx.putImageData(this.imageData,0,0); ctx.beginPath(); ctx.lineWidth = drawShapeObj.line; ctx.strokeStyle = drawShapeObj.color; ctx.fillStyle = drawShapeObj.color; } //画线 DragImg.prototype.line = function(e){ // //清除画布 // ctx.clearRect(0,0,canvas.width,canvas.height); // //绘制之前的形状 // this.imageData && ctx.putImageData(this.imageData,0,0); // ctx.beginPath(); // ctx.lineWidth = drawShapeObj.line; // ctx.strokeStyle = drawShapeObj.color; this.common(); ctx.moveTo(this.dis.x,this.dis.y); ctx.lineTo(e.offsetX,e.offsetY); console.log(e.offsetX); ctx.stroke(); } //画矩形 DragImg.prototype.rect = function(e){ this.common(); var {x,y} = this.dis; // ctx.rect(this.dis.x,this.dis.y,Math.abs(e.offsetX-this.dis.x),Math.abs(e.offsetY-this.dis.y)); //路径 ctx.rect(x,y,Math.abs(e.offsetX-x),Math.abs(e.offsetY-y)); //路径 // ctx.stroke(); //描边 ctx[drawShapeObj.strokeFill](); //根据变量动态决定是描边还是填充 } //画圆 DragImg.prototype.circle = function(e){ this.common(); const {x,y} = this.dis; var radius = Math.abs(e.offsetX - x); ctx.arc(x,y,radius,0,2*Math.PI,true); ctx[drawShapeObj.strokeFill](); } //清除 DragImg.prototype.clear = function(e){ ctx.clearRect(e.offsetX,e.offsetY,drawShapeObj.clearWidth,drawShapeObj.clearWidth); } //清除区域 DragImg.prototype.cleararea = function(e){ const {x,y} = this.dis; ctx.clearRect(x,y,Math.abs(e.offsetX-x),Math.abs(e.offsetY-y)); } var p1 = new DragImg();