婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解如何用HTML5 Canvas API控制圖片的縮放變換

詳解如何用HTML5 Canvas API控制圖片的縮放變換

熱門標簽:飛亞外呼系統(tǒng) 西寧智能外呼系統(tǒng)加盟 貸款電銷人工和機器人哪個好 電話機器人如何 百應電銷機器人產(chǎn)業(yè) 電視購物電銷外呼系統(tǒng) 聯(lián)通400電話申請 高德地圖標注賓館位置 杭州營銷電銷機器人供應商

縮放變換scale(sx,sy)傳入兩個參數(shù),分別是水平方向和垂直方向上對象的縮放倍數(shù)。例如context.scale(2,2)就是對圖像放大兩倍。其實,看上去簡單,實際用起來還是有一些問題的。我們來看一段代碼:

JavaScript Code復制內(nèi)容到剪貼板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  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?!趕快換一個吧!!   
  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>  

運行結果:

 其實縮放很簡單,稍微復雜的是,如何讓鼠標成為放大或者縮小的中心。如果數(shù)學幾何不好,計算公式就可能看不明白了。

JavaScript Code復制內(nèi)容到剪貼板
  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*(-40));   
  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. }  

  這個時候,基本功能就實現(xiàn)了,加載一張圖片和加載多張圖片都差不多,維護每一張圖片的位置和大小,下面來整理一下代碼吧。

JavaScript Code復制內(nèi)容到剪貼板
  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*(-40));   
  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. }  

縮放變換應注意的問題
看了上面的例子,大家一定對產(chǎn)生的結果有點奇怪。一是左上角頂點的坐標變了,而是線條的粗細也變了。因此,對于縮放變換有兩點問題需要注意:

縮放時,圖像左上角坐標的位置也會對應縮放。
縮放時,圖像線條的粗細也會對應縮放。
比如對于最小的那個原始矩形,它左上角的坐標是(50,50),線條寬度是5px,但是放大2倍后,左上角坐標變成了(100,100),線條寬度變成了10px。這就是縮放變換的副作用。

童鞋們一定在期待著我說解決副作用的途徑。很遺憾,沒有什么好的方法去解決這些副作用。如果想固定左上角坐標縮放,可以把左上角坐標變成(0,0),這樣的話無論是什么倍數(shù),0乘上它還是0,所以不變。如果不想讓線條粗細變化,那就別使用線條。或者自己封裝一個函數(shù),不要使用scale()。

究其根本,之前我們說過平移變換、旋轉變換、縮放變換都屬于坐標變換,或者說是畫布變換。因此,縮放并非縮放的是圖像,而是整個坐標系、整個畫布!就像是對坐標系的單位距離縮放了一樣,所以坐標和線條都會進行縮放。仔細想想,這一切貌似挺神奇的。

標簽:晉中 內(nèi)蒙古 撫州 邯鄲 玉溪 牡丹江 安慶 煙臺

巨人網(wǎng)絡通訊聲明:本文標題《詳解如何用HTML5 Canvas API控制圖片的縮放變換》,本文關鍵詞  詳解,如,何用,HTML5,Canvas,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解如何用HTML5 Canvas API控制圖片的縮放變換》相關的同類信息!
  • 本頁收集關于詳解如何用HTML5 Canvas API控制圖片的縮放變換的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    极品少妇一区二区| 国产精品成人午夜| 日韩在线卡一卡二| 欧美高清在线精品一区| 日韩视频免费观看高清完整版在线观看| 99国内精品久久| 国产精品亚洲综合一区在线观看| 日韩制服丝袜av| 性感美女极品91精品| 亚洲乱码日产精品bd| 国产精品色呦呦| 中文字幕 久热精品 视频在线 | 美腿丝袜亚洲综合| 亚洲精品日韩一| 亚洲精品欧美二区三区中文字幕| 国产精品色眯眯| 精品国产区一区| 26uuu国产日韩综合| 精品99久久久久久| 精品久久久久久综合日本欧美| 欧美一区二区三区精品| 91精品蜜臀在线一区尤物| 91精品久久久久久久91蜜桃| 日韩午夜av电影| 久久久www成人免费无遮挡大片| www国产精品av| 国产三区在线成人av| 中文字幕在线不卡视频| 亚洲精品福利视频网站| 日韩极品在线观看| 国内成人免费视频| 99久久精品国产一区| 91激情在线视频| 欧美色偷偷大香| 日韩欧美在线不卡| 国产精品亲子伦对白| 一区二区三区在线视频观看 | 色综合天天综合在线视频| 欧美日韩极品在线观看一区| 欧美午夜电影在线播放| 日一区二区三区| 亚洲精品一区二区三区影院| 色综合久久中文综合久久牛| 国产高清亚洲一区| 欧美一区日韩一区| 欧美精品三级日韩久久| 欧美一区二区成人| 中文字幕欧美激情| 成人精品视频一区二区三区 | 日韩精品一区二区三区在线播放 | 国产乱码精品一区二区三区av | 成人黄色在线网站| 美国毛片一区二区三区| 日韩精品一区二区三区视频播放| 中文字幕一区二区三中文字幕| 五月天欧美精品| 久久精品人人做人人综合| 欧美探花视频资源| 日韩综合小视频| 在线免费观看一区| 91精品婷婷国产综合久久性色| 亚洲精品在线观看视频| 欧美美女直播网站| 国产欧美一区二区精品久导航| 国产欧美精品一区aⅴ影院| 精品福利一二区| 亚洲欧美电影一区二区| 天天色图综合网| 亚洲成va人在线观看| 精品午夜一区二区三区在线观看| 蜜臀精品久久久久久蜜臀| 97久久超碰精品国产| 日本丶国产丶欧美色综合| 欧美绝品在线观看成人午夜影视| 国产欧美日韩不卡| 麻豆精品视频在线| 免费的国产精品| 日日摸夜夜添夜夜添精品视频| 午夜伦理一区二区| 欧美三级日韩三级国产三级| 久久久精品日韩欧美| 成人av电影在线| 国产精品久久久久一区| 成人av电影在线播放| 久久精品亚洲精品国产欧美kt∨| 亚洲免费av高清| 欧美高清一级片在线| 亚洲综合视频在线| 国产精品久线在线观看| 亚洲国产成人tv| 懂色av一区二区三区免费观看| 欧美日韩你懂的| 亚洲人快播电影网| 丰满亚洲少妇av| 日本一区二区免费在线观看视频| 日韩精品电影在线观看| 91国模大尺度私拍在线视频| 亚洲欧美偷拍卡通变态| caoporen国产精品视频| 久久久亚洲午夜电影| 国内精品视频666| 欧美一区二区三级| 美女尤物国产一区| 日韩三级在线免费观看| 色伊人久久综合中文字幕| 欧美国产禁国产网站cc| www.日韩大片| 国产精品进线69影院| 曰韩精品一区二区| 日韩小视频在线观看专区| 亚洲成人免费影院| 寂寞少妇一区二区三区| 欧美韩日一区二区三区四区| 日本一区二区三级电影在线观看| 欧美一区二区精美| aaa亚洲精品| 久久精品一区二区| 中文字幕乱码一区二区免费| 国产毛片精品视频| 久久精品欧美日韩精品| 另类中文字幕网| 国产亚洲精品免费| 波多野结衣亚洲一区| 亚洲精品va在线观看| 欧美人动与zoxxxx乱| 日韩在线一二三区| 日韩午夜精品视频| 成人一级黄色片| 国产精品一二三四五| 黄色资源网久久资源365| 欧美日韩一区小说| 日本在线不卡视频一二三区| 国产精品一级在线| 3atv在线一区二区三区| 亚洲精品一区二区三区99| 亚洲激情图片小说视频| 看片网站欧美日韩| 韩国精品久久久| 成人激情校园春色| 91丨porny丨最新| 日韩高清不卡一区二区| 免费在线观看一区| 69p69国产精品| 欧美xfplay| 17c精品麻豆一区二区免费| 亚洲国产精品嫩草影院| 久久国产欧美日韩精品| 国产精品一区二区91| 99久久亚洲一区二区三区青草| 日韩一区二区在线看片| 久久九九久久九九| 久久先锋影音av鲁色资源网| 一区二区不卡在线视频 午夜欧美不卡在 | 久久久久久久久99精品| 国产精品一区二区三区乱码| 欧美巨大另类极品videosbest | 国产一区二区三区观看| 亚洲自拍欧美精品| 懂色中文一区二区在线播放| 在线播放/欧美激情| 久久亚洲捆绑美女| 欧美手机在线视频| av中文字幕不卡| 国产一区二区在线电影| 亚洲一卡二卡三卡四卡无卡久久| 久久久久国产一区二区三区四区| 欧美一区二区在线播放| 欧美性猛交xxxxxx富婆| av亚洲产国偷v产偷v自拍| 国产99久久久国产精品潘金| 久久精品国产成人一区二区三区 | 久国产精品韩国三级视频| 亚洲成a天堂v人片| 亚洲激情图片小说视频| 日韩理论片在线| 国产精品私人自拍| 中文字幕高清一区| 中文字幕 久热精品 视频在线| 精品久久久久av影院| 日韩欧美国产小视频| 精品国产一区二区三区忘忧草| 精品裸体舞一区二区三区| 精品免费国产二区三区| 欧美日韩和欧美的一区二区| 色av成人天堂桃色av| 91丨porny丨首页| 色综合久久六月婷婷中文字幕| 91在线观看视频| 日本韩国精品在线| 欧美性高清videossexo| 欧美唯美清纯偷拍| 日韩丝袜美女视频| 久久久综合视频| 国产欧美日韩在线视频| 国产亚洲一区字幕| 国产精品久久久久久久久动漫| 亚洲欧美偷拍卡通变态| 亚洲一区欧美一区| 免费不卡在线视频| 粉嫩嫩av羞羞动漫久久久|