canvas裁剪不规则多边形区域的核心是限定绘制范围:先用beginpath()、lineto()和closepath()绘制闭合路径,再调用clip()使后续drawimage()仅在该区域内生效;或用destination-in合成模式,先绘图再填色抠图;需注意路径闭合、坐标缩放及导出时复现逻辑。

用 Canvas 裁剪不规则多边形区域,核心是让图像只在你画出的多边形路径内显示。这不是“擦掉外面”,而是“只允许里面绘制”——靠 clip() 或合成模式(如 destination-in)实现。
用 clip() 方法限定绘制范围
这是最直接、性能较好、适合动态更新的方式:
- 先调用
ctx.beginPath() - 用
moveTo()和多个lineTo()连出多边形顶点(确保首尾闭合,建议显式调用ctx.closePath()) - 立即执行
ctx.clip()—— 此后所有绘制(包括drawImage())都只在该多边形内生效 - 再绘制图片:
ctx.drawImage(img, 0, 0),图像超出多边形的部分自动不可见 - 若之后还要画其他内容(不限于该区域),记得提前
ctx.save(),裁剪完用ctx.restore()恢复
用 destination-in 合成模式“抠图”
适合需要保留原始图像位置、或与背景混合的场景,原理是“只保留重叠部分”:
- 先完整绘制原图:
ctx.drawImage(img, 0, 0) - 切换合成模式:
ctx.globalCompositeOperation = 'destination-in' - 绘制多边形路径并填充(必须
fill(),颜色任意,不透明即可) - 此时图像只剩多边形区域可见,其余变透明
- 操作完建议还原合成模式:
ctx.globalCompositeOperation = 'source-over'
绘制多边形路径的关键细节
不规则 ≠ 随意,路径必须清晰、闭合、坐标准确:
- 顶点坐标可手写(如五角星)、计算生成(如正多边形公式)、或由用户鼠标点击采集后连线
- 避免自相交路径,否则不同浏览器裁剪行为可能不一致
- 高 DPI 屏幕上,若 canvas 是按 devicePixelRatio 放大渲染的,路径坐标也要同比例缩放,否则裁剪边缘偏移
- 可用
ctx.isPointInPath(x, y)判断某点是否在当前路径内,适合做交互反馈(如悬停高亮)
导出裁剪结果图像
裁剪只是显示效果,要保存为新图片需额外一步:
- 创建新 canvas(尺寸可设为多边形外接矩形,或按需固定)
- 将原图和多边形路径逻辑复现到新 canvas 上(同样用
clip()+drawImage()) - 调用
newCanvas.toBlob(callback, 'image/png')或toDataURL()获取结果 - 注意:不能直接截图展示用的 canvas——它可能含缩放、辅助线等干扰元素
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











