HTML5 利用Canvas API 組合圖形

來源:互聯網
上載者:User

 在HTML5中有11種組合圖形的方式,只要把他們設定到context.globalCompositeOperation中就可以了,我這裡做了一個小例子來證明各種圖形組合方式的結果

HTML代碼很簡單,就2個控制項,一個是下拉式清單,讓使用者選擇組合方式,並且一旦使用者做出了選擇,就執行js函數draw(id),從而在第二個控制項canvas上根據使用者當前選擇的組合方式進行畫圖。第二個控制項就是一個canvas,用於顯示畫圖的內容。

 
  1. <!DOCTYPE html> 
  2. <head> 
  3. <meta charset="UTF-8"> 
  4. <title>HTML5 Combine Shape DEMO</title> 
  5. <script type="text/javascript" src="js/drawCombinedShape.js"></script> 
  6. </head> 
  7.  
  8. <body></body> 
  9. <h2>canvas:顯示組合圖形</h2> 
  10.  
  11. <!-- 建立一個下拉式清單來讓使用者選擇按照什麼方式來組合圖形 --> 
  12. <!-- 一旦使用者做出了選擇,就會觸發onchange處理函數,於是調用js函數,讓其在canvas組件上畫圖 --> 
  13. <select id="selectCombineMethod" onchange="draw('canvas')"> 
  14. <option >source-atop</option> 
  15. <option>source-in</option> 
  16. <option>source-out</option> 
  17. <option>source-over</option> 
  18. <option>destination-atop</option> 
  19. <option>destination-in</option> 
  20. <option>destination-out</option> 
  21. <option>destination-over</option> 
  22. <option>lighter</option> 
  23. <option>copy</option> 
  24. <option>xor</option> 
  25. </select> 
  26. <br><br> 
  27.  
  28. <!-- 指定一個canvas元素用於顯示結果 --> 
  29. <canvas id="canvas" width="1000” height="1000"/> 
  30. <br><br> 

js函數就是負責響應下拉式清單的onchange事件從而在canvas上畫圖,它先繪製原圖形(distination,在這裡是一個藍色正方形),然後取得使用者選擇的組合方式,再根據此方式畫出新圖形source,在這裡是一個紅色的圓):

 
  1. /** 
  2.  *  This file is confidential by Charles.Wang 
  3.  *  Copyright belongs to Charles.wang 
  4.  *  You can make contact with Charles.Wang (charles_wang888@126.com) 
  5.  */ 
  6.   
  7.   
  8.  function draw(id){ 
  9.      
  10.     //得到使用者選擇的圖形組合選項: 
  11.     var selectComponent=document.getElementById("selectCombineMethod"); 
  12.     //取得使用者的選擇的索引 
  13.     var selectedIndex =selectComponent.selectedIndex; 
  14.     //得到使用者的選擇的值,也就是選擇的圖形組合策略 
  15.     var selectedCombinedStrategy = selectComponent.options[selectedIndex].value; 
  16.      
  17.     //得到頁面上的畫布對象 
  18.     var canvas=document.getElementById(id); 
  19.     if(canvas ==null) 
  20.     return false; 
  21.      
  22.     var context = canvas.getContext('2d'); 
  23.     //畫原來的圖形,藍色正方形 
  24.     context.fillStyle="blue"; 
  25.     context.fillRect(40,40,60,60); 
  26.      
  27.     //將使用者選擇的圖形組合方式設定到context中 
  28.     context.globalCompositeOperation=selectedCombinedStrategy; 
  29.      
  30.     //畫新圖形,是一個紅色的圓 
  31.     //這時候,context會根據圖形的組合策略來決定如何繪製這2個圖形 
  32.     context.beginPath(); 
  33.     context.fillStyle="red"; 
  34.     context.arc(40+60,40+60,30,0,Math.PI*2,false); 
  35.     context.fill(); 
  36.      
  37.    
  38.      
  39.      
  40.  } 

 

實驗可以根據你使用者的選擇來顯示不同結果:

這裡的source是紅色的圓新圖形),distination是藍色正方形舊圖形)

 

  • source-atop=新圖形中新 and 老)+老圖形中!(新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325511B8-0.png" />

 

  • source-in=新圖形中新 and 老)

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325515225-1.png" />

 

  • source-out=新圖形中!新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/13255113A-2.png" />

 

  • source-over預設值)=老圖形中!新 and 老))+新圖形中全部)

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325512395-3.png" />

 

  • destination-atop=老圖形中新 and 老)+新圖形中!新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325514058-4.png" />

 

  • destination-in=老圖形中新 and 老)

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/132551DW-5.png" />

 

  • destination-out=老圖形中!新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/132551K56-6.png" />

 

  • destination-over=老圖形中全部)+新圖形中!新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325515219-7.png" />

 

  • lighter=老圖形中!新 and 老))+ 新圖形中!新 and 老))+新 and 老色彩疊加) 

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/13255141M-8.png" />

 

  • copy=新圖形中全部)

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325513194-9.png" />

 

  • xor對稱差)=老圖形中!新 and 老))+新圖形中!新 and 老))

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131228/1325513Y9-10.png" />

本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/854073

相關文章

聯繫我們

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