详解怎样用HTML5 Canvas API操纵照片的放缩转换

日期:2021-01-19 类型:科技新闻 

关键词:ps网页版在线制作,静态网页制作方法,微云网页版,怎么制作一个网页,django网页模板

放缩转换scale(sx,sy)传入两个主要参数,各自是水平方位和竖直方位上目标的放缩倍数。比如context.scale(2,2)便是对图象变大两倍。实际上,看上去简易,具体用起来還是有1些难题的。大家看来1段编码:

JavaScript Code拷贝內容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF⑻">   
  5.     <title>放缩转换</title>   
  6.     <style>   
  7.         body { background: url("./images/bg3.jpg") repeat; }  
  8.         #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }   
  9.     </style>   
  10. </head>   
  11. <body>   
  12. <div id="canvas-warp">   
  13.     <canvas id="canvas">   
  14.         你的访问器竟然不适用Canvas?!赶紧换1个吧!!   
  15.     </canvas>   
  16. </div>   
  17.   
  18. <script>   
  19.     window.onload = function(){   
  20.         var canvas = document.getElementById("canvas");   
  21.         canvas.width = 800;   
  22.         canvas.height = 600;   
  23.         var context = canvas.getContext("2d");   
  24.         context.fillStyle = "#FFF";   
  25.         context.fillRect(0,0,800,600);   
  26.   
  27.         context.strokeStyle = "red";   
  28.         context.lineWidth = 5;   
  29.         for(var i = 1; i < 4; i++){   
  30.             context.save();   
  31.             context.scale(i,i);   
  32.             context.strokeRect(50,50,150,100);   
  33.             context.restore();   
  34.         }   
  35.     };   
  36. </script>   
  37. </body>   
  38. </html>  

运作結果:

 实际上放缩很简易,略微繁杂的是,怎样让电脑鼠标变成变大或变小的管理中心。假如数学课几何图形不太好,测算公式便可能看不搞清楚了。

JavaScript Code拷贝內容到剪贴板
  1. canvas.onmousewheel=canvas.onwheel=function(event){//chrome firefox访问器适配   
  2.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
  3.     event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(⑷0));   
  4.     if(event.wheelDelta>0){   
  5.         imgScale*=2;   
  6.         imgX=imgX*2-pos.x;   
  7.         imgY=imgY*2-pos.y;   
  8.     }else{   
  9.         imgScale/=2;   
  10.         imgX=imgX*0.5+pos.x*0.5;   
  11.         imgY=imgY*0.5+pos.y*0.5;   
  12.     }   
  13.     drawImage();   
  14. }  

  这个情况下,基础作用就完成了,载入1张照片和载入多张照片都类似,维护保养每张照片的部位和尺寸,下面来梳理1下编码吧。

JavaScript Code拷贝內容到剪贴板
  1. var canvas,context;   
  2. var img,//照片目标   
  3.     imgIsLoaded,//照片是不是载入进行;   
  4.     imgX=0,   
  5.     imgY=0,   
  6.     imgScale=1;   
  7.     
  8. (function int(){   
  9.     canvas=document.getElementById('canvas');   
  10.     context=canvas.getContext('2d');   
  11.     loadImg();   
  12. })();   
  13.     
  14. function loadImg(){   
  15.     img=new Image();   
  16.     img.onload=function(){   
  17.         imgIsLoaded=true;   
  18.         drawImage();   
  19.     }   
  20.     img.src="map.jpg";   
  21. }   
  22.     
  23. function drawImage(){   
  24.     context.clearRect(0,0,canvas.width,canvas.height);   
  25.     context.drawImage(img,0,0,img.width,img.height,imgX,imgY,img.width*imgScale,img.height*imgScale);   
  26. }   
  27.     
  28. canvas.onmousedown=function(event){   
  29.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
  30.     canvas.onmousemove=function(event){   
  31.         canvas.style.cursor="move";   
  32.         var pos1=windowToCanvas(canvas,event.clientX,event.clientY);   
  33.         var x=pos1.x-pos.x;   
  34.         var y=pos1.y-pos.y;   
  35.         pos=pos1;   
  36.         imgX+=x;   
  37.         imgY+=y;   
  38.         drawImage();   
  39.     }   
  40.     canvas.onmouseup=function(){   
  41.         canvas.onmousemove=null;   
  42.         canvas.onmouseup=null;   
  43.         canvas.style.cursor="default";   
  44.     }   
  45. }   
  46. canvas.onmousewheel=canvas.onwheel=function(event){   
  47.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
  48.     event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(⑷0));   
  49.     if(event.wheelDelta>0){   
  50.         imgScale*=2;   
  51.         imgX=imgX*2-pos.x;   
  52.         imgY=imgY*2-pos.y;   
  53.     }else{   
  54.         imgScale/=2;   
  55.         imgX=imgX*0.5+pos.x*0.5;   
  56.         imgY=imgY*0.5+pos.y*0.5;   
  57.     }   
  58.     drawImage();   
  59. }   
  60.     
  61. function windowToCanvas(canvas,x,y){   
  62.     var bbox = canvas.getBoundingClientRect();   
  63.     return {   
  64.         x:x - bbox.left - (bbox.width - canvas.width) / 2,   
  65.         y:y - bbox.top - (bbox.height - canvas.height) / 2   
  66.     };   
  67. }  

放缩转换应留意的难题
看了上面的事例,大伙儿1定对造成的結果有点怪异。1是左上角端点的座标变了,而是线条的粗细也变了。因而,针对放缩转换有两点难题必须留意:

放缩时,图象左上角座标的部位也会对应放缩。
放缩时,图象线条的粗细也会对应放缩。
例如针对最少的那个初始矩形框,它左上角的座标是(50,50),线条宽度是5px,可是变大2倍后,左上角座标变为了(100,100),线条宽度变为了10px。这便是放缩转换的不良反应。

童鞋们1定在希望着我说处理不良反应的方式。很遗憾,沒有甚么好的方式去处理这些不良反应。假如想固定不动左上角座标放缩,能够把左上角座标变为(0,0),这样的话不管是甚么倍数,0乘上它還是0,因此不会改变。假如不想让线条粗细转变,那就别应用线条。或自身封裝1个涵数,不必应用scale()。

究其压根,以前大家说过平移转换、转动转换、放缩转换都属于座标转换,或说是画布转换。因而,放缩并不是放缩的是图象,而是全部座标系、全部画布!就好像对座标系的企业间距放缩了1样,因此座标和线条都会开展放缩。细心想一想,这1切貌似挺奇异的。