在canvas上实现画多个框的功能(框可实现拉伸功能)

html代码如下:

<canvas id="myCanvas" width="700" height="400" style="border:1px solid #d3d3d3;">
        Your browser does not support the HTML5 canvas tag.
</canvas>

js的代码如下:

const c=document.getElementById("myCanvas");
const ctx=c.getContext("2d");
const scaleStep=1.05;
const minWidth=700,minHeight=400,maxWidth=750,maxHeight=450;
const img=document.createElement('img');
const elementWidth=700,elementHeight=400;
let startx,//起始x坐标
    starty,//起始y坐标
    flag,//是否点击鼠标的标志
    x,
    y,
    leftDistance,
    topDistance,
    op=0,//op操作类型 0 无操作 1 画矩形框 2 拖动矩形框
    scale=1,
	type=0;
let layers=[];//图层
let currentR;//当前点击的矩形框
img.src='https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg';
img.onload=function(){
    c.style.backgroundImage="url("+img.src+")";
    c.style.backgroundSize=`${c.width}px ${c.height}px`;
}
function reshow(x,y){
        let allNotIn=1;
        layers.forEach(item=>{
            //起始(重置)当前路劲
            ctx.beginPath();
            //绘制矩形
            ctx.rect(item.x1,item.y1,item.width,item.height);
            ctx.strokeStyle=item.strokeStyle
            if(x>=(item.x1-25/scale)&&x<=(item.x1+25/scale)&&y<=(item.y2-25/scale)&&y>=(item.y1+25/scale)){
                    resizeLeft(item);
            }else if(x>=(item.x2-25/scale)&&x<=(item.x2+25/scale)&&y<=(item.y2-25/scale)&&y>=(item.y1+25/scale)){
                    resizeWidth(item);
            }else if(y>=(item.y1-25/scale)&&y<=(item.y1+25/scale)&&x<=(item.x2-25/scale)&&x>=(item.x1+25/scale)){
                    resizeTop(item);
            }else if(y>=(item.y2-25/scale)&&y<=(item.y2+25/scale)&&x<=(item.x2-25/scale)&&x>=(item.x1+25/scale)){
                    resizeHeight(item);
            }else if(x>=(item.x1-25/scale)&&x<=(item.x1+25/scale)&&y<=(item.y1+25/scale)&&y>=(item.y1-25/scale)){
                    resizeLT(item);
            }else if(x>=(item.x2-25/scale)&&x<=(item.x2+25/scale)&&y<=(item.y2+25/scale)&&y>=(item.y2-25/scale)){
                    resizeWH(item);
            }else if(x>=(item.x1-25/scale)&&x<=(item.x1+25/scale)&&y<=(item.y2+25/scale)&&y>=(item.y2-25/scale)){
                    resizeLH(item);
            }else if(x>=(item.x2-25/scale)&&x<=(item.x2+25/scale)&&y<=(item.y1+25/scale)&&y>=(item.y1-25/scale)){
                    resizeWT(item);
            }
            if(ctx.isPointInPath(x*scale,y*scale)){//检测指定的点是否在当前的路径中,否则返回true
				render(item);
                allNotIn=0;
            }
            //绘制已定义的路径
            ctx.stroke();
        })
    if(flag&&allNotIn&&op<3){
        op=1
    }

}
function isPointInRetc(x,y){
    let len=layers.length;
    for(let i=0;i<len;i++){
        if(layers[i].x1<x&&x<layers[i].x2&&layers[i].y1<y&&y<layers[i].y2){
            return layers[i];
        }
    }
}

调整矩形框的大小

//调整矩形框的大小
function fixPosition(position){
    if(position.x1>position.x2){
        let x=position.x1;
        position.x1=position.x2;
        position.x2=x;
    }
    if(position.y1>position.y2){
        let y=position.y1;
        position.y1=position.y2;
        position.y2=y;
    }
    position.width=position.x2-position.x1
    position.height=position.y2-position.y1
	if(position.width<50||position.height<50){
		position.width=60;
		position.height=60;
		position.x2+=position.x1+60;
		position.y2+=position.y1+60;
	}
    return position
}

这样就可实现图片的选框。图片如下所示。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值