HTML Canvas 混合
globalCompositeOperation 属性
globalCompositeOperation 属性设置绘制新形状时应用的混合操作类型。在前面的章节中,新图形会相互叠加。我们可以使用 globalCompositeOperation 属性来决定如何处理新图形。
让我们来看一些例子!
"source-over" 值
"source-over" 值是默认值。它会将新形状绘制在现有内容之上。
示例
将 globalCompositeOperation 属性设置为 "source-over"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "source-over";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"source-out" 值
"source-out" 值仅在不与现有内容重叠的地方绘制新形状。
示例
将 globalCompositeOperation 属性设置为 "source-out"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "source-out";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"destination-over" 值
"destination-over" 值会将新形状绘制在现有内容后面。
示例
将 globalCompositeOperation 属性设置为 "destination-over"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "destination-over";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"destination-atop" 值
"destination-atop" 值将保留与新形状重叠的现有内容。新形状绘制在现有内容后面。
示例
将 globalCompositeOperation 属性设置为 "destination-atop"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "destination-atop";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"lighter" 值
"lighter" 值会在两个形状重叠的地方产生更亮的颜色。
示例
将 globalCompositeOperation 属性设置为 "lighter"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "lighter";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"copy" 值
"copy" 值只会显示新形状。
示例
将 globalCompositeOperation 属性设置为 "copy"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "copy";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"xor" 值
"xor" 值会在两个形状重叠的地方使它们透明,其他地方正常绘制。
示例
将 globalCompositeOperation 属性设置为 "xor"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "xor";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"multiply" 值
"multiply" 值会产生更暗的图像。将顶层像素与底层像素相乘。
示例
将 globalCompositeOperation 属性设置为 "multiply"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "multiply";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"screen" 值
"screen" 值会产生更亮的图像。将像素反转,然后相乘,再反转(与 "multiply" 相反)。
示例
将 globalCompositeOperation 属性设置为 "screen"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "screen";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"darken" 值
"darken" 值会在两个形状重叠的地方产生更暗的颜色(保留两个图层的最暗像素)。
示例
将 globalCompositeOperation 属性设置为 "darken"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "darken";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"lighten" 值
"lighten" 值会在两个形状重叠的地方产生更亮的颜色(保留两个图层的最亮像素)。
示例
将 globalCompositeOperation 属性设置为 "lighten"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "lighten";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"hue" 值
"hue" 值采用顶层的色相,并保留底层的信息和饱和度。
示例
将 globalCompositeOperation 属性设置为 "hue"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "hue";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
"luminosity" 值
"luminosity" 值采用顶层的信息,并保留底层的色相和饱和度。
示例
将 globalCompositeOperation 属性设置为 "luminosity"。然后绘制两个重叠的矩形
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = "luminosity";
// 绘制两个重叠的矩形
ctx.fillStyle = "blue";
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = "red";
ctx.fillRect(40, 40, 100, 100);
</script>
自己动手试一试 »
globalCompositeOperation 属性值
globalCompositeOperation 属性可以具有以下值
| 值 | 描述 |
|---|---|
| source-over | 默认值。将新形状绘制在现有内容之上 |
| source-in | 仅在新形状和现有内容重叠的地方绘制新形状。其他地方均透明 |
| source-out | 仅在新形状不与现有内容重叠的地方绘制新形状 |
| source-atop | 仅在新形状与现有内容重叠的地方绘制新形状 |
| destination-over | 将新形状绘制在现有内容后面 |
| destination-in | 保留新形状和现有内容重叠的部分。其他地方均透明 |
| destination-out | 保留新形状不重叠的现有内容 |
| destination-atop | 保留新形状重叠的现有内容。新形状绘制在现有内容后面 |
| lighter | 在两个形状重叠的地方产生更亮的颜色 |
| copy | 仅显示新形状 |
| xor | 形状在重叠处透明,其他地方正常绘制 |
| multiply | 将顶层像素与底层像素相乘。结果是更暗的图像 |
| screen | 反转像素,然后相乘,再反转。结果是更亮的图像(与 "multiply" 相反) |
| overlay | "multiply" 和 "screen" 的组合。底层颜色暗的部分更暗,亮的部分更亮 |
| darken | 保留两个图层的最暗像素 |
| lighten | 保留两个图层的最亮像素 |
| color-dodge | 用反转的顶层像素除以底层像素 |
| color-burn | 用反转的底层像素除以顶层像素,然后反转结果 |
| hard-light | 类似于 "overlay",但交换了顶层和底层 |
| soft-light | "hard-light" 的柔和版本 |
| difference | 从顶层像素减去底层像素(或反之),以始终得到正值 |
| exclusion | 类似于 "difference",但对比度较低 |
| hue | 采用顶层的色相,并保留底层的信息和饱和度 |
| saturation | 采用顶层的饱和度,并保留底层的信息和色相 |
| color | 采用顶层的色相和饱和度,并保留底层的信息 |
| luminosity | 采用顶层的信息,并保留底层的色相和饱和度 |