javascript結合canvas實現圖片旋轉效果

來源:互聯網
上載者:User

javascript結合canvas實現圖片旋轉效果

   圖片的旋轉可以說是一種效果,但是逐漸旋轉已經不單單是屬於視覺效果那個範疇,其更具有使用性,功能性。照片有時候是需要橫過來的拍的,當我們預覽或共用到web上時需要進行旋轉。這個操作在以往可能更多的是交給軟體去完成,然後再將旋轉到正常角度的圖片發布到web上。

  我們在微博上可以對圖片進行向左轉向右轉等旋轉操作,讓使用者可以從不同的視角欣賞圖片效果。本文將結合執行個體為您講解如何使用Javascript結合相關技術來實現圖片的旋轉效果。我們使用HTML5的canvas標籤可對圖片進行旋轉操作,對於ie6,7,8不支援HTML5的瀏覽器,我們使用IE特有的濾鏡效果來實現圖片旋轉。

  HTML

  我們在頁面中放置一張圖片,在圖片的上方放置兩個按鈕,通過onclick事件調用rotate()函數來控製圖片向左向右旋轉。

  ?

1

2

3

4

5

6

7

<div id="tool"> 

   <a href="#" id="arr_left" onclick="rotate('myimg','left')">向左</a> 

   <a href="#" id="arr_right" onclick="rotate('myimg','right')">向右</a> 

</div> 

<div id="img"> 

   <img src="demo.jpg" width="460" height="305" alt="" id="myimg" /> 

</div>

  Javascript

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

function rotate(obj,arr){ 

  var img = document.getElementById(obj); 

  if(!img || !arr) return false; 

  var n = img.getAttribute('step'); 

  if(n== null) n=0; 

  if(arr=='left'){ 

    (n==0)? n=3:n--; 

  }else if(arr=='right'){ 

    (n==3)? n=0:n++; 

  } 

  img.setAttribute('step',n); 

  ... 

}

  我們寫了個自訂函數rotate(),其中參數obj表示要旋轉的圖片對象的id,參數arr表示旋轉方向,固定兩個值:left(向左)和right(向右)。我們設定變數n是為了記錄上下左右四種旋轉狀態,點擊旋轉按鈕時可以保證持續的旋轉的狀態,即每次旋轉是在上次旋轉操作後的基礎上再次旋轉。

  然後,我們要根據瀏覽器的不同進行不同的處理,對於IE系瀏覽器,可以使用他們特有的濾鏡來實現旋轉效果,雖然我們不建議使用濾鏡,但為了相容IE老版本,我們不得不重操這把舊刀。

  ?

1

2

3

4

5

6

7

8

9

10

function rotate(obj,arr){ 

  ... 

  //對IE瀏覽器使用濾鏡旋轉 

  if(document.all) { 

    img.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ n +')'; 

  // 對現代瀏覽器寫入HTML5的元素進行旋轉: canvas 

  }else{ 

    ... 

  } 

}

  代碼中,我們使用document.all判斷是否為IE瀏覽器,如果是則使用濾鏡,而對於firefox和chrome這樣的現代瀏覽器,我們使用canvas來實現旋轉效果。

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

function rotate(obj,arr){ 

  ... 

  // 對現代瀏覽器寫入HTML5的元素進行旋轉: canvas 

  }else{ 

    var c = document.getElementById('canvas_'+obj); 

    if(c== null){ 

      img.style.visibility = 'hidden'; 

      img.style.position = 'absolute'; 

      c = document.createElement('canvas'); 

      c.setAttribute("id",'canvas_'+obj); 

      img.parentNode.appendChild(c); 

    } 

    var canvasContext = c.getContext('2d'); 

    switch(n) { 

      default : 

      case 0 : 

        c.setAttribute('width', img.width); 

        c.setAttribute('height', img.height); 

        canvasContext.rotate(0 * Math.PI / 180); 

        canvasContext.drawImage(img, 0, 0); 

        break; 

      case 1 : 

        c.setAttribute('width', img.height); 

        c.setAttribute('height', img.width); 

        canvasContext.rotate(90 * Math.PI / 180); 

        canvasContext.drawImage(img, 0, -img.height); 

        break; 

      case 2 : 

        c.setAttribute('width', img.width); 

        c.setAttribute('height', img.height); 

        canvasContext.rotate(180 * Math.PI / 180); 

        canvasContext.drawImage(img, -img.width, -img.height); 

        break; 

      case 3 : 

        c.setAttribute('width', img.height); 

        c.setAttribute('height', img.width); 

        canvasContext.rotate(270 * Math.PI / 180); 

        canvasContext.drawImage(img, -img.width, 0); 

        break; 

    }; 

  } 

}

  代碼中,我們建立canvas元素對象,並將圖片賦予canvas對象,當變數n處於不同的狀態(上下左右四個方向)時,使用canvas重新對映像進行繪製。

  當然,圖片的旋轉效果實現還有一種解決方案,繞開html5,針對各不同的瀏覽器,比如firefox下面可以用-moz-transform: rotate(); webkit可以用-webkit-transform: rotate(); 但這並不如html5的canvas實現的效果好。

  以上所述就是本文給大家分享的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.