canvas圖形的組合與裁切

當兩個或兩個以上的圖形存在重疊區域時,默認狀況下一個圖形畫在前一個圖像之上。經過指定圖像globalCompositeOperation屬性的值能夠改變圖形的繪製順序或繪製方式,globalAlpha能夠指定圖形的透明度。javascript

globalCompositeOperation 屬性設置或返回如何將一個源(新的)圖像繪製到目標(已有)的圖像上。css

源圖像 = 您打算放置到畫布上的繪圖。html

目標圖像 = 您已經放置在畫布上的繪圖。java

ctx.globalCompositeOperation = 'source-over'; 默認設置canvas

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width:300px; height: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     var c=document.getElementById("myCanvas");
15     var ctx=c.getContext("2d");
16     
17     ctx.fillStyle="red";
18     ctx.fillRect(20,20,75,50);
19     ctx.fillStyle="blue";    
20     ctx.globalCompositeOperation="source-over";  //在目標圖像上顯示源圖像。
21     
22     ctx.fillRect(50,50,75,50);    
23     ctx.fillStyle="red";
24     ctx.fillRect(150,20,75,50);
25     ctx.fillStyle="blue";    
26     ctx.globalCompositeOperation="destination-over";  //在源圖像上方顯示目標圖像。
27     ctx.fillRect(180,50,75,50);    
28 };
29 
30 </script>
31 </head>
32 <body>
33     <div id="div1">
34         <canvas id="myCanvas" width="300" height="300"></canvas>
35     </div>
36 </body>
37 </html>

結果:app

屬性值:spa

source-over 默認。在目標圖像上顯示源圖像。
source-atop 在目標圖像頂部顯示源圖像。源圖像位於目標圖像以外的部分是不可見的。
source-in 在目標圖像中顯示源圖像。只有目標圖像內的源圖像部分會顯示,目標圖像是透明的。
source-out 在目標圖像以外顯示源圖像。只會顯示目標圖像以外源圖像部分,目標圖像是透明的。
destination-over 在源圖像上方顯示目標圖像。
destination-atop 在源圖像頂部顯示目標圖像。源圖像以外的目標圖像部分不會被顯示。
destination-in 在源圖像中顯示目標圖像。只有源圖像內的目標圖像部分會被顯示,源圖像是透明的。
destination-out 在源圖像外顯示目標圖像。只有源圖像外的目標圖像部分會被顯示,源圖像是透明的。
lighter 顯示源圖像 + 目標圖像。
copy 顯示源圖像。忽略目標圖像。
source-over 使用異或操做對源圖像與目標圖像進行組合。

 

 

 

 

 

 

 

 

 

eg:code

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 canvas{border:1px solid #d1d1d1; margin:20px 20px 20px 0}
 8 </style>
 9 
10 </head>
11 <body style="margin: 50px;">
12 <script type="text/javascript">
13     
14     var gco=new Array();
15     gco.push("source-atop");
16     gco.push("source-in");
17     gco.push("source-out");
18     gco.push("source-over");
19     gco.push("destination-atop");
20     gco.push("destination-in");
21     gco.push("destination-out");
22     gco.push("destination-over");
23     gco.push("lighter");
24     gco.push("copy");
25     gco.push("xor");
26     
27     for (i=0;i<gco.length;i++){
28         document.write("<div id='p_" + i + "' style='float:left;'>" + gco[i] + ":<br>");
29         var c=document.createElement("canvas");
30         c.width=120;
31         c.height=100;
32         document.getElementById("p_" + i).appendChild(c);
33         var ctx=c.getContext("2d");    
34         ctx.fillStyle="blue";
35         ctx.fillRect(10,10,50,50);
36         ctx.globalCompositeOperation=gco[i];
37         ctx.beginPath();
38         ctx.fillStyle="red";
39         ctx.arc(50,50,30,0,2*Math.PI);
40         ctx.fill();
41         document.write("</div>");    
42     }
43 
44 </script>
45 </body>
46 </html>

結果:orm

二、裁切路徑htm

ctx.clip();  clip的做用是造成一個蒙板,沒有被蒙板的區域會被隱藏。

eg:若是繪製一個圖形,並進行裁切,則圓形以外的區域將不會繪製在canvas上。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <style type="text/css">
 7 *{padding: 0;margin:0;}
 8 body{background: #1b1b1b;}
 9 #div1{margin:50px auto; width: 300px;}
10 canvas{background: #fff;}
11 </style>
12 <script type="text/javascript">
13 window.onload = function(){
14     draw();    
15 };
16 function draw(){
17     var ctx = document.getElementById('myCanvas').getContext('2d');
18     
19     ctx.fillStyle = '#000';
20     ctx.fillRect(0,0,300,300);
21     ctx.fill();
22     //繪製圓形
23     ctx.beginPath();
24     ctx.arc(150,150,130,0,Math.PI*2,true);
25     //裁切路徑
26     ctx.clip();
27     ctx.translate(200,20);
28     for( var i=0; i<90; i++){
29         ctx.save();
30         ctx.transform(0.95,0,0,0.95,30,30);
31         ctx.rotate(Math.PI/12);
32         ctx.beginPath();
33         ctx.fillStyle = 'red';
34         ctx.globalAlpha = '0.4';
35         ctx.arc(0,0,50,0,Math.PI*2,true);
36         ctx.closePath();
37         ctx.fill();
38     }
39     
40 }
41 </script>
42 </head>
43 <body>
44     <div id="div1">
45         <canvas id="myCanvas" width="300" height="300"></canvas>
46     </div>
47 </body>
48 </html>

相關文章
相關標籤/搜索