利用HTML5 canvas旋轉圖片

來源:互聯網
上載者:User

最近突然想研究一下js旋轉圖片的功能。對於之前的實現方式,就不先說了。現在HTML5很不錯,主要瞭解一下HTML5中的圖片旋轉吧。

執行個體示範: 

http://www.imqing.com/demo/rotateImg.html

原理:利用canvas對象來旋轉。

實現方式:首先建立一個canvas元素,然後把img元素繪入canvas。但是,實際上,這是預設情況,就是圖片沒旋轉時。如果圖片要旋轉90度的話,就需要先把canvas畫布旋轉90度後再繪圖。

描述如下: 內部旋轉原理是這樣的,圖片的座標是從左上方開始計算,向右為x正方向,向下為y正方向,在旋轉畫布canvas時,實際上是這個座標在旋轉,所以最後繪圖方式不一樣。當時我還用了picpick來測量旋轉一定角度後起點座標,才知道原來旋轉是這樣的,嘿嘿。)

代碼:

 

 
  1. <body>  
  2.     <button onclick="rotateImg('testImg', 'left')">向左旋轉</button>  
  3.     <button onclick="rotateImg('testImg', 'right')">向右旋轉</button><br/>  
  4.     <img src="./test.jpg" id="testImg"/>  
  5. <script>  
  6.     function rotateImg(pid, direction) {  
  7.         //最小與最大旋轉方向,圖片旋轉4次後回到原方向  
  8.         var min_step = 0;  
  9.         var max_step = 3;  
  10.         var img = document.getElementById(pid);  
  11.         if (img == null)return;  
  12.         //img的高度和寬度不能在img元素隱藏後擷取,否則會出錯  
  13.         var height = img.height;  
  14.         var width = img.width;  
  15.         var step = img.getAttribute('step');  
  16.         if (step == null) {  
  17.             step = min_step;  
  18.         }  
  19.         if (direction == 'right') {  
  20.             step++;  
  21.             //旋轉到原位置,即超過最大值  
  22.             step > max_step && (step = min_step);  
  23.         } else {  
  24.             step--;  
  25.             step < min_step && (step = max_step);  
  26.         }  
  27.         img.setAttribute('step', step);  
  28.         var canvas = document.getElementById('pic_' + pid);  
  29.         if (canvas == null) {  
  30.             img.style.display = 'none';  
  31.             canvas = document.createElement('canvas');  
  32.             canvas.setAttribute('id', 'pic_' + pid);  
  33.             img.parentNode.appendChild(canvas);  
  34.         }  
  35.         //旋轉角度以弧度值為參數  
  36.         var degree = step * 90 * Math.PI / 180;  
  37.         var ctx = canvas.getContext('2d');  
  38.         switch (step) {  
  39.             case 0:  
  40.                 canvas.width = width;  
  41.                 canvas.height = height;  
  42.                 ctx.drawImage(img, 0, 0);  
  43.                 break;  
  44.             case 1:  
  45.                 canvas.width = height;  
  46.                 canvas.height = width;  
  47.                 ctx.rotate(degree);  
  48.                 ctx.drawImage(img, 0, -height);  
  49.                 break;  
  50.             case 2:  
  51.                 canvas.width = width;  
  52.                 canvas.height = height;  
  53.                 ctx.rotate(degree);  
  54.                 ctx.drawImage(img, -width, -height);  
  55.                 break;  
  56.             case 3:  
  57.                 canvas.width = height;  
  58.                 canvas.height = width;  
  59.                 ctx.rotate(degree);  
  60.                 ctx.drawImage(img, -width, 0);  
  61.                 break;  
  62.         }  
  63.     }  
  64. </script>  
  65. </body> 

解釋:   canvas.width與height就不用解釋了吧,應該。rotate應該也不用吧?關鍵是
drawImage(img, x, y);

其中的x,y是指從哪一點開始畫,因為整個座標系統旋轉了,所以,x,y不一樣,比如step=1,圖片向右旋轉了90度,即座標系旋轉了90度,那麼起始位置應該是
x = 0,   y=  img.height

其它類似可得。是不是覺得很簡單呢?

請看http://www.imqing.com/blog/wp/2012/09/html5-canvas-rotate-image/

本文出自 “Qing's web” 部落格,請務必保留此出處http://qings.blog.51cto.com/4857138/997998

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.