<html> <head> <meta charset="utf-8"> </head> <body> <center> <table><tr> <td> <canvas id="canvas" width="256" height="256" style="border: solid 1px #000;box-sizing: border-box;"></canvas> </td> <td> <form action="./" method="POST" id="init_id"> <input type = "submit" value="Initialize"> </form> <label><input type="checkbox" id="show_anchors" checked>Show anchor points</label> </td> </tr></table> <table border="1"> <tr><td>Mouse drag:</td><td>Translation</td></tr> <tr><td>Middle mouse button:</td><td>Set anchor point</td></tr> <tr><td>Mouse wheel:</td><td>Zoom in & out</td></tr> <tr><td>'i' or 'o' key + mouse drag:</td><td>Translation with zooming in & out</td></tr> <tr><td>'s' key:</td><td>style mixing</td></tr> </table> </center> <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <script> // Canvas var cnvs = document.getElementById('canvas'); var ctx = cnvs.getContext('2d'); // Define variables const cnvWidth = 256; const cnvHeight = 256; var clickFlg = 0; var bgColor = "rgb(0,0,0)"; var img_base64 = {{canvas_img|tojson}}; var sx0, sy0, sx, sy; var dz = 0; var stop_points = []; var mouse_button; var zoom_in = 0; var zoom_out = 0; var show_anchors = document.getElementById('show_anchors'); show_anchors.addEventListener('change', e => { draw_image_on_canvas(img_base64); }); setBgColor(); function draw_image_on_canvas(img_base64){ if(img_base64.length!=0){ var img = new Image(); img.src = img_base64; ctx.drawImage(img, 0, 0, 256, 256); img.onload = function(){ ctx.drawImage(img, 0, 0, 256, 256); draw_points_on_canvas(); } } } function draw_points_on_canvas(){ if(show_anchors.checked){ stop_points.forEach(function(value){ ctx.beginPath(); ctx.arc( value[0], value[1], 5, 0 * Math.PI / 180, 360 * Math.PI / 180, false ); ctx.fillStyle = "rgb(135,206,235)"; ctx.fill(); ctx.strokeStyle = "rgb(128,128,128)"; ctx.lineWidth = 2; ctx.stroke(); }); } } draw_image_on_canvas(img_base64); // Events on canva $("#canvas").mousedown(function(e){ clickFlg = 1; sx0 = e.offsetX; sy0 = e.offsetY; sx = e.offsetX; sy = e.offsetY; mouse_button = e.button; if(mouse_button==1){ show_anchors.checked = 1; let rad = 5; let filtered_points = stop_points.filter((pt)=>{ return((pt[0]-sx)*(pt[0]-sx)+(pt[1]-sy)*(pt[1]-sy)>rad*rad); }); if(filtered_points.length<stop_points.length){ stop_points = filtered_points; }else{ stop_points.push([sx,sy]); } draw_image_on_canvas(img_base64); } }).mouseup(function(){ clickFlg = 0; }).mousemove(function(e){ if(!clickFlg) return false; //draw(e.offsetX, e.offsetY); if(mouse_button==0){ show_anchors.checked = 0; var ex = e.offsetX; var ey = e.offsetY; var dx0 = ex-sx0; var dy0 = ey-sy0; var dx = ex-sx; var dy = ey-sy; if(Math.sqrt(dx0*dx0+dy0*dy0)>5){ $.post("/translate", {dx:dx,dy:dy,dz:dz,sx:sx,sy:sy,stop_points:JSON.stringify(stop_points),zi:zoom_in,zo:zoom_out}).done(function(data) { img_base64 = $.parseJSON(data).img; draw_image_on_canvas(img_base64); }) sx0 = ex; sy0 = ey; //sx = ex; //sy = ey; } } }); cnvs.addEventListener('wheel', (e) => { show_anchors.checked = 0; sx = e.offsetX; sy = e.offsetY; if(e.deltaY<0){ dz -= 1; }else{ dz += 1; } $.post("/zoom", {dz:dz,sx:sx,sy:sy,stop_points:JSON.stringify(stop_points)}).done(function(data) { img_base64 = $.parseJSON(data).img; draw_image_on_canvas(img_base64); }) }); document.addEventListener('keydown', e => { if(e.key=="s"){ $.post("/changestyle").done(function(data) { img_base64 = $.parseJSON(data).img; stop_points = []; dz = 0; draw_image_on_canvas(img_base64); }) } if(e.key=="r"){ $.post("/reset").done(function(data) { img_base64 = $.parseJSON(data).img; stop_points = []; dz = 0; draw_image_on_canvas(img_base64); }) } if(e.key=="i"){ zoom_in = 1; } if(e.key=="o"){ zoom_out = 1; } }); document.addEventListener('keyup', e => { if(e.key=="i"){ zoom_in = 0; } if(e.key=="o"){ zoom_out = 0; } }); function setBgColor(){ ctx.fillStyle = bgColor; ctx.fillRect(0,0,cnvWidth,cnvHeight); } document.getElementById('init-id').addEventListener('submit', function (e) { e.preventDefault(); var form = this; var base64 = cnvs.toDataURL(); var newInput = document.createElement("input"); newInput.type="hidden"; newInput.name = "canvas"; newInput.value=base64; form.appendChild(newInput); form.submit(); }, false); </script> </body> </html>