canvas学习笔记5_globalCompositeOperation、clip

348 阅读1分钟

globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。

源图像 = 您打算放置到画布上的绘图。

目标图像 = 您已经放置在画布上的绘图。

参考文档: developer.mozilla.org/zh-CN/docs/…

一般情况下,我们总是将一个图形画在另一个之上,对于其他更多的情况,仅仅这样是远远不够的。 比如,对合成的图形来说,绘制顺序会有限制

不过,我们可以利用 globalCompositeOperation 属性来改变这种状况。 此外, clip属性允许我们隐藏不想看到的部分图形

globalCompositeOperation (图像组合)

我们不仅可以在已有图形后面再画新图形,还可以用来遮盖指定区域清除画布中的某些部分(清除区域不仅限于矩形,像clearRect()方法做的那样)以及更多其他操作。

这个属性设定了在画新图形时采用的遮盖策略,其值是一个标识12种遮盖方式的字符串。

var gco=new Array();
gco.push("source-atop");
gco.push("source-in");
gco.push("source-out");
gco.push("source-over");
gco.push("destination-atop");
gco.push("destination-in");
gco.push("destination-out");
gco.push("destination-over");
gco.push("lighter");
gco.push("copy");
gco.push("xor");
for (n=0;n<gco.length;n++) {
        document.write("<div id='p_" + n + "' style='float:left;'>" + gco[n] + ":<br>");
        var c=document.createElement("canvas");
        c.width=120;
        c.height=100;
        document.getElementById("p_" + n).appendChild(c);
        var ctx=c.getContext("2d");    
        ctx.fillStyle="dodgerblue";
        ctx.fillRect(10,10,50,50);
        ctx.globalCompositeOperation = gco[n];
        ctx.beginPath();
        ctx.fillStyle="red";
        ctx.arc(50,50,30,0,2*Math.PI);
        ctx.fill();
        document.write("</div>");	
}
// 蓝色是目标图像(先绘制)
// 红色是源图像(后绘制)

显示结果如下:

image.png

使用场景总结:

  • destination-out: 使用该类型,可以绘制出透明的效果。常用的如刮刮乐等效果……
  • lighter:可以通过该类型,绘制出颜色更亮的图像

通过图像组合达到不同的效果:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
    var WIDTH = 400;
    var HEIGHT = 400;
    var  canvas =document.getElementById("canvas");
    canvas.width = WIDTH;
    canvas.height = HEIGHT;
    var ctx = canvas.getContext("2d"); 
    ctx.fillStyle = 'dodgerblue';
    ctx.fillRect(0, 0, WIDTH, HEIGHT);
    ctx.globalCompositeOperation = 'source-over';
    ctx.fillStyle = 'rgba(0,0,0,0.5)';
    ctx.fillRect(0, 0, WIDTH/2, HEIGHT/2);
    ctx.globalCompositeOperation = 'lighter'; 
    ctx.fillStyle = 'green';
    ctx.arc(150,150,50,0,2*Math.PI);
    ctx.arc(300,300,50,0,2*Math.PI);
    ctx.fill();
    // globalCompositeOperation 设置前的图像是目标图像,设置后绘制的是源图像
</script>
</body>
</html>

显示结果:

image.png

三种图形的color分别是:dodgerblue, rgba(0,0,0,0.5),green。