Straighten image in HTML5 canvas by rotating from the center of the image and zoom -


instagram has great straighten feature https://help.instagram.com/135826209959819

where if straighten image rotate center of image , zoom.

rotating in canvas rotates not center(i think 0,0)

and zoom zooms towards 0,0

context.rotate(.01) context.scale(2.2, 2.2) 

do know way force canvas rotate center, zoom towards center?

cheers

to answer question...you can set desired rotation point using:

context.translate(desiredrotationx,desiredrotationy) 

this causes context.rotate rotate around desired rotation point.

but note: proper rotation point of unstraightened image might/might not center of image. depends on original rotation point of original image.

perhaps better way of straightening image to:

  • find top-left , top-right corner points of image.

  • determine angle of line connecting 2 points.

  • rotate image negative of angle.

enter image description here

example code , demo:

var canvas1=document.getelementbyid("canvas1");  var ctx1=canvas1.getcontext("2d");    var canvas=document.getelementbyid("canvas");  var ctx=canvas.getcontext("2d");  var $canvas=$("#canvas");  var canvasoffset=$canvas.offset();  var offsetx=canvasoffset.left;  var offsety=canvasoffset.top;  var scrollx=$canvas.scrollleft();  var scrolly=$canvas.scrolltop();    var cw,ch,topleft,topright,bottomright,bottomleft;  var pt,pr,pb,pl;    var img=new image();  img.crossorigin='anonymous';  img.onload=start;  //        img.src="https://dl.dropboxusercontent.com/u/139992952/multple/tiltedcw.png";  img.src="https://dl.dropboxusercontent.com/u/139992952/multple/tiltedccw.png";  function start(){    cw=canvas.width=img.width;    ch=canvas.height=img.height;    ctx.drawimage(img,0,0);      calccorners();      $("#canvas").mousedown(function(e){handlemousedown(e);});  }      function handlemousedown(e){    e.preventdefault();    e.stoppropagation();             mx=parseint(e.clientx-offsetx);    my=parseint(e.clienty-offsety);      var dt=calcdistance(mx,my,pt);    var dr=calcdistance(mx,my,pr);    var db=calcdistance(mx,my,pb);    var dl=calcdistance(mx,my,pl);      if(dt<dr && dt<db && dt<dl){      topleft=pt;      topright=pr;      bottomright=pb    }else if(dr<dt && dr<db && dr<dl){      topleft=pr;      topright=pb;      bottomright=pl;    }else if(db<dt && db<dr && db<dl){      topleft=pb;      topright=pl;      bottomright=pt;    }else{      topleft=pl;      topright=pt;      bottomright=pr;    }        // straighten    var dx=topright.x-topleft.x;    var dy=topright.y-topleft.y;    var angle=math.atan2(dy,dx);    var width=math.sqrt(dx*dx+dy*dy);    dx=bottomright.x-topright.x;    dy=bottomright.y-topright.y;    var height=math.sqrt(dx*dx+dy*dy);      canvas1.width=width;    canvas1.height=height;    ctx1.rotate(-angle);    ctx1.drawimage(img,-topleft.x,-topleft.y);    }    function calcdistance(mx,my,p){    var dx=mx-p.x;    var dy=my-p.y;    return(math.sqrt(dx*dx+dy*dy));  }    function calccorners(){    var data=ctx.getimagedata(0,0,cw,ch).data;      // pt (topmost)    for(var y=0;y<ch;y++){      for(var x=0;x<cw;x++){        var n=(y*cw+x)*4+3;        if(!pt &&data[n]>40){ pt={x:x,y:y}; break; }      }}    // pr (rightmost)    for(var x=cw-1;x>=0;x--){      for(var y=ch-1;y>=0;y--){        var n=(y*cw+x)*4+3;        if(!pr &&data[n]>40){ pr={x:x,y:y}; break; }      }}    // pb (bottommost)    for(var y=ch-1;y>=0;y--){      for(var x=cw-1;x>=0;x--){        var n=(y*cw+x)*4+3;        if(!pb &&data[n]>40){ pb={x:x,y:y}; break; }      }}    // pl (leftmost)    for(var x=0;x<cw;x++){      for(var y=0;y<ch;y++){        var n=(y*cw+x)*4+3;        if(!pl && data[n]>40){ pl={x:x,y:y};  break; }      }}  }
body{ background-color: white; }  canvas{border:1px solid purple;}  #red{color:red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>  <h4>original: tilted transparency</h4>  <h4 id=red>click near top-left corner of image</h4>  <canvas id="canvas" width=300 height=300></canvas><br>  <h4>straightened</h4>  <canvas id="canvas1" width=300 height=300></canvas>


Comments

Popular posts from this blog

php - Submit Form Data without Reloading page -

linux - Rails running on virtual machine in Windows -