java 鼠标画矩形_用鼠标在画布上绘制Angular2绘制矩形

我是angular2和画布的新手,我正在尝试创建一个首先将图像绘制到画布上的组件,然后用户可以使用鼠标在该图像上绘制矩形(以点击和拖动方式) . 这是我到目前为止几乎按预期工作的 .

@Component({

selector:'app-annotation',

template:`

`

})

export class ObjectDetectionComponent implements OnInit{

startX:number=null;

startY:number=null;

drag=false;

@ViewChild("myCanvas") myCanvas:ElementRef;

mdEvent(e){

//persist starting position

this.startX=e.clientX;

this.startY=e.clientY;

this.drag=true;

}

mmEvent(e){

if(this.drag){

//redraw image on canvas

let base_image = new Image();

base_image.src = 'https://ak3.picdn.net/shutterstock/videos/10826363/thumb/1.jpg';

let context: CanvasRenderingContext2D = this.myCanvas.nativeElement.getContext("2d");

base_image.onload = function(){

context.canvas.height=base_image.height;

context.canvas.width=base_image.width;

context.drawImage(base_image, 0, 0);

};

//draw rectangle on canvas

let x = this.startX - this.myCanvas.nativeElement.getBoundingClientRect().left;

let y= this.startY- this.myCanvas.nativeElement.getBoundingClientRect().top;

let w = e.clientX -this.myCanvas.nativeElement.getBoundingClientRect().left - x;

let h = e.clientY -this.myCanvas.nativeElement.getBoundingClientRect().top - y;

context.setLineDash([6]);

context.strokeRect(x, y, w, h);

}

}

muEvent(e){

//draw final rectangle on canvas

let x = this.startX - this.myCanvas.nativeElement.getBoundingClientRect().left;

let y= this.startY- this.myCanvas.nativeElement.getBoundingClientRect().top;

let w = e.clientX -this.myCanvas.nativeElement.getBoundingClientRect().left - x;

let h = e.clientY -this.myCanvas.nativeElement.getBoundingClientRect().top - y;

this.myCanvas.nativeElement.getContext("2d").setLineDash([6]);

this.myCanvas.nativeElement.getContext("2d").strokeRect(x, y, w, h);

this.drag=false;

}

ngOnInit(){

//draw image on canvas

let base_image = new Image();

base_image.src = 'https://ak3.picdn.net/shutterstock/videos/10826363/thumb/1.jpg';

let context: CanvasRenderingContext2D = this.myCanvas.nativeElement.getContext("2d");

base_image.onload = function(){

context.canvas.height=base_image.height;

context.canvas.width=base_image.width;

context.drawImage(base_image, 0, 0);

}

}

}

这里的问题是,当单击并按住鼠标时,矩形仅显示是否有鼠标移动 - 但我希望只要仍然单击鼠标,仍然会显示当前矩形 . 这有点出乎意料,因为在 mmEvent() 中,在重绘图像后绘制矩形,所以我希望矩形是在任何鼠标移动事件之后绘制的最后一个东西 - 但是 base_image.onload() 回调可能会弄乱它的时间 . 有关解决此问题的任何建议吗?

更新:

在回调中绘制矩形似乎可以修复它

mmEvent(e) {

if (this.drag) {

//redraw image on canvas

let base_image = new Image();

base_image.src = 'https://ak3.picdn.net/shutterstock/videos/10826363/thumb/1.jpg';

let context: CanvasRenderingContext2D = this.myCanvas.nativeElement.getContext("2d");

let sx = this.startX;

let sy = this.startY;

let canvasTop = this.myCanvas.nativeElement.getBoundingClientRect().top;

let canvasLeft = this.myCanvas.nativeElement.getBoundingClientRect().left;

base_image.onload = function () {

context.canvas.height = base_image.height;

context.canvas.width = base_image.width;

context.drawImage(base_image, 0, 0);

//draw rectangle on canvas

let x = sx - canvasLeft;

let y = sy - canvasTop;

let w = e.clientX - canvasLeft - x;

let h = e.clientY - canvasTop - y;

context.setLineDash([6]);

context.strokeRect(x, y, w, h);

};

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值