ç»å Compositing
å¨ä¹åçä¾åéé¢ï¼æä»¬æ»æ¯å°ä¸ä¸ªå¾å½¢ç»å¨å¦ä¸ä¸ªä¹ä¸ï¼å¯¹äºå
¶ä»æ´å¤çæ
åµï¼ä»
ä»
è¿æ ·æ¯è¿è¿ä¸å¤çãæ¯å¦ï¼å¯¹åæçå¾å½¢æ¥è¯´ï¼ç»å¶é¡ºåºä¼æéå¶ãä¸è¿ï¼æä»¬å¯ä»¥å©ç¨ globalCompositeOperation 屿§æ¥æ¹åè¿ç§ç¶åµãæ¤å¤ï¼clip屿§å
许æä»¬éè䏿³çå°çé¨åå¾å½¢ã
globalCompositeOperation
æä»¬ä¸ä»
å¯ä»¥å¨å·²æå¾å½¢åé¢åç»æ°å¾å½¢ï¼è¿å¯ä»¥ç¨æ¥é®çæå®åºåï¼æ¸
é¤ç»å¸ä¸çæäºé¨åï¼æ¸
é¤åºåä¸ä»
éäºç©å½¢ï¼åclearRect()æ¹æ³åç飿 ·ï¼ä»¥åæ´å¤å
¶ä»æä½ã
globalCompositeOperation = type-
è¿ä¸ªå±æ§è®¾å®äºå¨ç»æ°å¾å½¢æ¶éç¨çé®ççç¥ï¼å ¶å¼æ¯ä¸ä¸ªæ è¯ 12 ç§é®çæ¹å¼çå符串ã
è£åè·¯å¾
è£åè·¯å¾åæ®éç canvas å¾å½¢å·®ä¸å¤ï¼ä¸åçæ¯å®çä½ç¨æ¯é®ç½©ï¼ç¨æ¥éèä¸éè¦çé¨åãå¦å³å¾æç¤ºã红边äºè§æå°±æ¯è£åè·¯å¾ï¼ææå¨è·¯å¾ä»¥å¤çé¨åé½ä¸ä¼å¨ canvas ä¸ç»å¶åºæ¥ã
妿åä¸é¢ä»ç»ç globalCompositeOperation 屿§ä½ä¸æ¯è¾ï¼å®å¯ä»¥å®ç°ä¸ source-in å source-atopå·®ä¸å¤çææãæéè¦çåºå«æ¯è£åè·¯å¾ä¸ä¼å¨ canvas ä¸ç»å¶ä¸è¥¿ï¼èä¸å®æ°¸è¿ä¸åæ°å¾å½¢çå½±åãè¿äºç¹æ§ä½¿å¾å®å¨ç¹å®åºåéç»å¶å¾å½¢æ¶ç¸å½å¥½ç¨ã
å¨ ç»å¶å¾å½¢ ä¸ç« ä¸ï¼æåªä»ç»äº stroke å fill æ¹æ³ï¼è¿éä»ç»ç¬¬ä¸ä¸ªæ¹æ³clipã
clip()-
å°å½åæ£å¨æå»ºçè·¯å¾è½¬æ¢ä¸ºå½åçè£åªè·¯å¾ã
æä»¬ä½¿ç¨ clip()æ¹æ³æ¥å建ä¸ä¸ªæ°çè£åè·¯å¾ã
é»è®¤æ åµä¸ï¼canvas æä¸ä¸ªä¸å®èªèº«ä¸æ ·å¤§çè£åè·¯å¾ï¼ä¹å°±æ¯æ²¡æè£åææï¼ã
clip ç示ä¾
è¿ä¸ªä¾åï¼æä¼ç¨ä¸ä¸ªåå½¢çè£åè·¯å¾æ¥éå¶éæºææçç»å¶åºåã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.fillRect(0, 0, 150, 150);
ctx.translate(75, 75);
// Create a circular clipping path
ctx.beginPath();
ctx.arc(0, 0, 60, 0, Math.PI * 2, true);
ctx.clip();
// draw background
var lingrad = ctx.createLinearGradient(0, -75, 0, 75);
lingrad.addColorStop(0, "#232256");
lingrad.addColorStop(1, "#143778");
ctx.fillStyle = lingrad;
ctx.fillRect(-75, -75, 150, 150);
// draw stars
for (var j = 1; j < 50; j++) {
ctx.save();
ctx.fillStyle = "#fff";
ctx.translate(
75 - Math.floor(Math.random() * 150),
75 - Math.floor(Math.random() * 150),
);
drawStar(ctx, Math.floor(Math.random() * 4) + 2);
ctx.restore();
}
}
function drawStar(ctx, r) {
ctx.save();
ctx.beginPath();
ctx.moveTo(r, 0);
for (var i = 0; i < 9; i++) {
ctx.rotate(Math.PI / 5);
if (i % 2 == 0) {
ctx.lineTo((r / 0.525731) * 0.200811, 0);
} else {
ctx.lineTo(r, 0);
}
}
ctx.closePath();
ctx.fill();
ctx.restore();
}
é¦å
ï¼æç»äºä¸ä¸ªä¸ canvas 䏿 ·å¤§å°çé»è²æ¹å½¢ä½ä¸ºèæ¯ï¼ç¶åç§»å¨åç¹è³ä¸å¿ç¹ãç¶åç¨ clip æ¹æ³å建ä¸ä¸ªå¼§å½¢çè£åè·¯å¾ãè£åè·¯å¾ä¹å±äº canvas ç¶æçä¸é¨åï¼å¯ä»¥è¢«ä¿åèµ·æ¥ã妿æä»¬å¨å建æ°è£åè·¯å¾æ¶æ³ä¿ç忥çè£åè·¯å¾ï¼æä»¬éè¦åçå°±æ¯ä¿åä¸ä¸ canvas çç¶æã
è£åè·¯å¾å建ä¹åææåºç°å¨å®éé¢çä¸è¥¿æä¼ç»åºæ¥ãå¨ç»çº¿æ§æ¸åæ¶æä»¬å°±ä¼æ³¨æå°è¿ç¹ãç¶åä¼ç»å¶åº 50 é¢éæºä½ç½®åå¸ï¼ç»è¿ç¼©æ¾ï¼çææï¼å½ç¶ä¹åªæå¨è£åè·¯å¾éé¢çæææä¼ç»å¶åºæ¥ã