I need to draw rectangle and text on captured image with touch start, touch move, touch end event.
I tried like this:
<canvas #canvas (touchstart)="startDrawing($event)" (touchmove)="moved($event)" (touchend)="endDrawing($event)"></canvas>
import { Component, OnInit,ViewChild, Renderer, AfterViewInit } from '@angular/core';
import { IonContent, Platform, NavParams, ModalController } from '@ionic/angular';
// import * as ImageEditor from 'tui-image-editor';
declare var $:any;
@Component({
selector: 'app-edit-img',
templateUrl: './edit-img.page.html',
styleUrls: ['./edit-img.page.scss'],
})
export class EditImgPage implements AfterViewInit {
img:any;
@ViewChild('canvas',{static:false}) canvas:any;
@ViewChild('finalCanvas',{static:false}) finalCanvas:any;
canvasElement:any;
finalCanvasElement:any;
saveX:number;
saveY:number;
drawing:boolean = false;
bgImg:any;
resized:any;
constructor(
private navParams: NavParams,
private modalController: ModalController,
private plt: Platform,
private modal: ModalController) {
this.img = this.navParams.get('img');
}
ngAfterViewInit(){
this.canvasElement = this.canvas.nativeElement;
this.finalCanvasElement = this.finalCanvas.nativeElement;
this.bgImg = new Image();
this.bgImg.src = this.img;
let ctx = this.canvasElement.getContext('2d');
this.bgImg.onload = () =>{
ctx.imageSmoothingEnabled = false;
ctx.drawImage(this.bgImg,0,0,this.canvasElement.width,this.canvasElement.height);
}
/* this.canvasElement.height = 350;
this.canvasElement.width = this.plt.width()+''; */
this.canvasElement.height = this.bgImg.height / 12;
this.canvasElement.width = this.bgImg.width / 12;
/* this.canvasElement.height = 500;
this.canvasElement.width = 300;
*/
}
startDrawing(ev){
// console.log(ev)
this.drawing = true;
const canvasPosition = this.canvasElement.getBoundingClientRect();
console.log(canvasPosition)
this.saveX = ev.touches[0].pageX - canvasPosition.x;
this.saveY = ev.touches[0].pageY - canvasPosition.y;
}
moved(ev){
// console.log(ev)
if(!this.drawing) return;
let ctx = this.canvasElement.getContext('2d');
ctx.clearRect(0,0,this.canvasElement.width,this.canvasElement.height);
ctx.drawImage(this.bgImg,0,0,this.canvasElement.width,this.canvasElement.height);
const canvasPosition = this.canvasElement.getBoundingClientRect();
let currentX = parseInt(ev.touches[0].pageX) - parseInt(canvasPosition.x);
let currentY = parseInt(ev.touches[0].pageY) - parseInt(canvasPosition.y);
ctx.beginPath();
var width = currentX - this.saveX;
var height = currentY - this.saveY;
ctx.rect(this.saveX,this.saveY,width,height);
ctx.strokeStyle = 'red';
ctx.lineWidth = 3;
ctx.stroke();
}
endDrawing(ev){
this.drawing = false;
}
save(){
this.finalCanvasElement.height = this.bgImg.height;
this.finalCanvasElement.width = this.bgImg.width;
let editedBase64 = this.canvasElement.toDataURL();
let img = new Image();
img.src = editedBase64;
let ctx = this.finalCanvasElement.getContext('2d');
img.onload = () =>{
ctx.imageSmoothingEnabled = false;
ctx.drawImage(img,0,0,this.finalCanvasElement.width,this.finalCanvasElement.height);
}
// this.resized = this.canvasElement.toDataURL();
let final;
setTimeout(()=>{
final = this.finalCanvasElement.toDataURL('image/jpeg', 1.0);
this.modalController.dismiss({editedImg:final});
},2000)
/* console.log(editedBase64)
console.log(final) */
}
close(){
this.modal.dismiss({editedImg:null});
}
}
Problems are:
- capured image height and width is very large.when load that image on canvas not fully visible in screen.
2.cant draw text on canvs