canvas不规则抠图核心是clip()配合闭合路径实现视觉裁剪,需手动调用closepath()确保路径闭合,再drawimage显示;导出实际图像需计算外接矩形并用getimagedata/putimagedata提取像素,同时适配devicepixelratio。

网页端用 Canvas 实现不规则图形抠图,核心是 clip() 方法配合自定义路径,不是删像素,而是“开一扇形状的窗”,只让窗内内容显示。
构造闭合路径是前提
Canvas 不会自动识别你画的是不是完整形状。必须手动确保路径闭合:
- 调用
ctx.beginPath()开始新路径 - 用
moveTo()、lineTo()、arc()或bezierCurveTo()连点成形(比如五角星、心形、文字轮廓) - 最后一定要调用
ctx.closePath()—— 缺了这步,多数浏览器不执行裁剪
应用剪辑并绘制目标图像
路径画好后,立即调用 clip() 锁定区域,再绘制图片:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
ctx.clip()只影响之后的绘制,对已画内容无效 - 接着用
ctx.drawImage(img, x, y)绘图,图像只会出现在你定义的路径范围内 - 若想后续绘图不受限制,提前用
ctx.save()保存状态,之后ctx.restore()恢复
导出实际抠出的图像(非视觉遮罩)
clip() 只是视觉裁剪,画布尺寸没变。要真正提取“抠出来”的那块图像,需两步:
- 先算出不规则路径的最小外接矩形(
getBoundingClientRect()辅助或手动遍历顶点求 min/max) - 再用
ctx.getImageData(x, y, width, height)获取该矩形区域的像素数据 - 创建新 canvas,用
putImageData()把数据写进去,就得到独立的不规则抠图结果
注意设备像素比和交互反馈
在高清屏(如 Retina)上直接按 CSS 像素画路径,会导致剪辑边缘模糊或偏移:
- 获取
window.devicePixelRatio,将路径坐标、canvas 尺寸都乘以该值 - 需要判断某点是否在抠图区内(比如鼠标悬停高亮),可用
ctx.isPointInPath(x, y) - 避免过度嵌套
save()/restore(),复杂场景建议用离屏 canvas 预合成再裁剪










