一、所有组合方式概览
globalCompositeOperation 的所有属性值
source-over | 默认。在目标图像上(先画的)显示源图像(后画的) |
---|---|
source-atop | 在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。 |
source-in | 在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。 |
source-out | 在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。 |
destination-over | 在源图像上方显示目标图像。 |
destination-atop | 在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示。 |
destination-in | 在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的 |
destination-out | 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。 |
lighter | 显示源图像 + 目标图像。 |
copy | 显示源图像。忽略目标图像。 |
source-over | 使用异或操作对源图像与目标图像进行组合。 |
我们先解释一下目标图和原图你就明白表格中的内容了
目标图:先画在画布上的图形
原图 :后画在画布上的图形
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "source-over";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
通俗的说:先画的上面显示后画的
![](https://img.haomeiwen.com/i7426676/458a3e71f4d75dd2.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "source-atop";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
通俗的说:在先画的上面显示后画的,但是后画的在先画的图形区域之外的隐藏
![](https://img.haomeiwen.com/i7426676/226a0d4eca1fe796.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "source-in";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
通俗的说:在先画的上面显示后画的,但是只有先画的图形内的后画图形才显示,其他都隐藏
![](https://img.haomeiwen.com/i7426676/a480909b885f769e.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "source-out";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
只显示先画的图形之外的后画图像
![](https://img.haomeiwen.com/i7426676/aee210d40771d4ac.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "destination-over";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
先画的在上面,后画的在下面
![](https://img.haomeiwen.com/i7426676/7d613398bc69a286.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "destination-atop";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
后画的图形之外的先画的图形都不会被显示
![](https://img.haomeiwen.com/i7426676/1084d31d99f5b058.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "destination-in";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
只有后画的图形上面的先画的图形才被显示
![](https://img.haomeiwen.com/i7426676/4ddaf4cd138f0b0c.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "destination-out";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
只有后画的图形之外的先画的图形才被显示
![](https://img.haomeiwen.com/i7426676/c071cc4e6fad4ecc.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "lighter";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
先画的+后画的,并且重叠部分颜色不同
![](https://img.haomeiwen.com/i7426676/54e93b18295ac8d2.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "copy";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
只显示后画的,忽略先画的
![](https://img.haomeiwen.com/i7426676/1556fe227ed64a13.png)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="800"></canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
//目标图:先画在画布上的图形,
context.beginPath();
context.arc(100,100,100,0,Math.PI*2);
context.fillStyle = "palevioletred";
context.fill();
context.globalCompositeOperation = "source-over";
//原图:后画在画布上的图形
context.beginPath();
context.fillStyle = "deepskyblue";
context.fillRect(50,50,200,200);
context.fill();
</script>
</html>
使用异或操作对源图像与目标图像进行组合。
![](https://img.haomeiwen.com/i7426676/4b0058f062bd1e42.png)
最后我们说一下,我们的 context.globalCompositeOperation
语句最好写在画两个图形的中间,也可以写在上面,不能两个图形的后面
网友评论