放缩转换scale(sx,sy)传入两个主要参数,各自是水平方位和竖直方位上目标的放缩倍数。比如context.scale(2,2)便是对图象变大两倍。实际上,看上去简易,具体用起来還是有1些难题的。大家看来1段编码:
JavaScript Code拷贝內容到剪贴板
- <!DOCTYPE html>
- <html lang="zh">
- <head>
- <meta charset="UTF⑻">
- <title>放缩转换</title>
- <style>
- body { background: url("./images/bg3.jpg") repeat; }
- #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
- </style>
- </head>
- <body>
- <div id="canvas-warp">
- <canvas id="canvas">
- 你的访问器竟然不适用Canvas?!赶紧换1个吧!!
- </canvas>
- </div>
-
- <script>
- window.onload = function(){
- var canvas = document.getElementById("canvas");
- canvas.width = 800;
- canvas.height = 600;
- var context = canvas.getContext("2d");
- context.fillStyle = "#FFF";
- context.fillRect(0,0,800,600);
-
- context.strokeStyle = "red";
- context.lineWidth = 5;
- for(var i = 1; i < 4; i++){
- context.save();
- context.scale(i,i);
- context.strokeRect(50,50,150,100);
- context.restore();
- }
- };
- </script>
- </body>
- </html>
运作結果:
实际上放缩很简易,略微繁杂的是,怎样让电脑鼠标变成变大或变小的管理中心。假如数学课几何图形不太好,测算公式便可能看不搞清楚了。
JavaScript Code拷贝內容到剪贴板
- canvas.onmousewheel=canvas.onwheel=function(event){
- var pos=windowToCanvas(canvas,event.clientX,event.clientY);
- event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(⑷0));
- if(event.wheelDelta>0){
- imgScale*=2;
- imgX=imgX*2-pos.x;
- imgY=imgY*2-pos.y;
- }else{
- imgScale/=2;
- imgX=imgX*0.5+pos.x*0.5;
- imgY=imgY*0.5+pos.y*0.5;
- }
- drawImage();
- }
这个情况下,基础作用就完成了,载入1张照片和载入多张照片都类似,维护保养每张照片的部位和尺寸,下面来梳理1下编码吧。
JavaScript Code拷贝內容到剪贴板
- var canvas,context;
- var img,
- imgIsLoaded,
- imgX=0,
- imgY=0,
- imgScale=1;
-
- (function int(){
- canvas=document.getElementById('canvas');
- context=canvas.getContext('2d');
- loadImg();
- })();
-
- function loadImg(){
- img=new Image();
- img.onload=function(){
- imgIsLoaded=true;
- drawImage();
- }
- img.src="map.jpg";
- }
-
- function drawImage(){
- context.clearRect(0,0,canvas.width,canvas.height);
- context.drawImage(img,0,0,img.width,img.height,imgX,imgY,img.width*imgScale,img.height*imgScale);
- }
-
- canvas.onmousedown=function(event){
- var pos=windowToCanvas(canvas,event.clientX,event.clientY);
- canvas.onmousemove=function(event){
- canvas.style.cursor="move";
- var pos1=windowToCanvas(canvas,event.clientX,event.clientY);
- var x=pos1.x-pos.x;
- var y=pos1.y-pos.y;
- pos=pos1;
- imgX+=x;
- imgY+=y;
- drawImage();
- }
- canvas.onmouseup=function(){
- canvas.onmousemove=null;
- canvas.onmouseup=null;
- canvas.style.cursor="default";
- }
- }
- canvas.onmousewheel=canvas.onwheel=function(event){
- var pos=windowToCanvas(canvas,event.clientX,event.clientY);
- event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(⑷0));
- if(event.wheelDelta>0){
- imgScale*=2;
- imgX=imgX*2-pos.x;
- imgY=imgY*2-pos.y;
- }else{
- imgScale/=2;
- imgX=imgX*0.5+pos.x*0.5;
- imgY=imgY*0.5+pos.y*0.5;
- }
- drawImage();
- }
-
- function windowToCanvas(canvas,x,y){
- var bbox = canvas.getBoundingClientRect();
- return {
- x:x - bbox.left - (bbox.width - canvas.width) / 2,
- y:y - bbox.top - (bbox.height - canvas.height) / 2
- };
- }
放缩转换应留意的难题
看了上面的事例,大伙儿1定对造成的結果有点怪异。1是左上角端点的座标变了,而是线条的粗细也变了。因而,针对放缩转换有两点难题必须留意:
放缩时,图象左上角座标的部位也会对应放缩。
放缩时,图象线条的粗细也会对应放缩。
例如针对最少的那个初始矩形框,它左上角的座标是(50,50),线条宽度是5px,可是变大2倍后,左上角座标变为了(100,100),线条宽度变为了10px。这便是放缩转换的不良反应。
童鞋们1定在希望着我说处理不良反应的方式。很遗憾,沒有甚么好的方式去处理这些不良反应。假如想固定不动左上角座标放缩,能够把左上角座标变为(0,0),这样的话不管是甚么倍数,0乘上它還是0,因此不会改变。假如不想让线条粗细转变,那就别应用线条。或自身封裝1个涵数,不必应用scale()。
究其压根,以前大家说过平移转换、转动转换、放缩转换都属于座标转换,或说是画布转换。因而,放缩并不是放缩的是图象,而是全部座标系、全部画布!就好像对座标系的企业间距放缩了1样,因此座标和线条都会开展放缩。细心想一想,这1切貌似挺奇异的。