canvas实现橡皮擦功能的核心是设置globalcompositeoperation = "destination-out",使新绘制路径“挖掉”已有像素;需先绘底图、擦除前设该模式、擦除后切回"source-over",并注意移动端适配与背景处理。

Canvas 实现橡皮擦功能,核心是把绘制模式切换为“擦除”,本质是用透明色(或目标背景色)覆盖原有内容。关键在于设置 globalCompositeOperation = "destination-out",让新绘制的内容“挖掉”已有像素。
设置擦除混合模式
在开始擦除前,必须将画布的合成模式设为 "destination-out":
- 该模式下,新绘制的图形会清除已有图像中重叠的部分,只保留透明区域
- 务必在擦除操作前设置:
ctx.globalCompositeOperation = "destination-out"; - 擦除结束后,记得恢复默认模式(如
"source-over"),否则后续绘图也会被擦除
用透明色 + 正常模式模拟擦除(备选方案)
如果目标环境不支持 destination-out(极少见),或需兼容 Canvas 2D 上下文限制,可改用背景色覆盖:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 先记录初始背景色(如白色:
#ffffff)或保存背景图层 - 设
ctx.fillStyle = "white"(或实际背景色),再用fillRect、arc等绘制“覆盖区域” - 缺点:无法真正擦除多层叠加内容,仅适用于单色背景或简单场景
结合鼠标/触控实现橡皮擦笔刷
橡皮擦体验取决于平滑轨迹和合适尺寸。推荐用 lineCap: "round" 和连续线段模拟软边效果:
- 监听
mousedown/touchstart,记录起始点,开启擦除路径 - 在
mousemove/touchmove中调用ctx.lineTo(x, y)+ctx.stroke() - 设置擦除宽度:
ctx.lineWidth = 20;;圆角边缘:ctx.lineCap = "round"; ctx.lineJoin = "round"; - 注意:每次擦除前重置路径(
ctx.beginPath()),避免意外连接
注意事项与常见问题
几个容易踩坑的地方:
-
不能对已导出的图片(
toDataURL后再 drawImage)直接擦除 —— 擦除只能作用于当前 Canvas 像素缓冲区 - 若画布启用了
willReadFrequently: true或使用 OffscreenCanvas,复合操作行为一致,无需额外处理 - 部分移动端浏览器对
destination-out在透明背景上表现异常,建议测试时用canvas.style.backgroundColor = "#eee"辅助观察
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










