You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HTML Canvas中仅让两个图形合成不影响其他已绘制图形

你使用的globalCompositeOperation = "destination-out"是全局生效的合成规则,作用对象是当前画布上所有已绘制的内容,因此挖洞操作会同时擦除底层的蓝色背景。

最优解决方式是直接使用Canvas路径的奇偶填充规则实现镂空,不需要修改全局合成模式,完全不会影响之前已经绘制的其他元素。修正后的代码如下:

// 原有蓝色背景绘制逻辑不变
context.fillStyle = 'blue';
context.fillRect(0, 0, width, height);

// 直接绘制带镂空的黑色矩形
context.fillStyle = "#000000";
context.beginPath();
// 添加外层矩形路径
context.rect(0, 0 , width, height);
// 添加内层圆形路径,完整圆形的结束角度应为2*Math.PI,修正原代码的参数错误
context.arc(width / 2, height / 2 , 80, 0, 2 * Math.PI);
// 用奇偶规则填充,内外路径重叠区域自动镂空,仅作用于本次填充的黑色矩形
context.fill('evenodd');

实现原理:Canvas默认的填充规则为非零环绕规则,指定evenodd规则后,会统计区域被路径包围的次数,次数为奇数时填充,偶数时不填充。中间圆形区域被外层矩形和内层圆形两条路径包围,计数为2(偶数),因此不会被填充,自然形成镂空效果,全程没有修改全局合成规则,不会影响其他已绘制元素。

内容的提问来源于stack exchange,提问作者Hjude_design

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:45:04