合成与裁剪

Canvas合成与裁剪完整教程,掌握合成模式、裁剪路径、透明度控制等高级绑制技巧。Canvas合成与裁剪是控制图形如何组合和显示的高级技术,可以实现复杂的视觉效果。

什么是合成与裁剪

在Canvas绑制过程中,新绑制的内容如何与已有内容交互是一个关键问题。Canvas提供了两种机制来控制这个过程:

  • 合成操作:控制新图形如何与已有内容混合
  • 裁剪路径:限制绑制区域,只显示特定形状内的内容

合成操作的概念

当你在Canvas上绑制多个图形时,后绑制的图形会覆盖先绑制的图形。合成操作允许你改变这种默认行为,实现各种混合效果:

ctx.globalCompositeOperation = 'source-over'  // 默认:新图形覆盖旧图形
ctx.globalCompositeOperation = 'destination-out'  // 擦除效果
ctx.globalCompositeOperation = 'lighter'  // 颜色叠加变亮

裁剪路径的概念

裁剪路径定义了一个可见区域,之后绑制的所有内容都只在这个区域内显示:

ctx.beginPath()
ctx.arc(100, 100, 50, 0, Math.PI * 2)
ctx.clip()  // 设置圆形裁剪区域

// 之后绑制的内容只在圆形区域内可见
ctx.fillRect(0, 0, 200, 200)

合成与裁剪的关系

合成和裁剪可以配合使用,实现更复杂的效果:

// 先设置裁剪区域
ctx.beginPath()
ctx.rect(50, 50, 100, 100)
ctx.clip()

// 再设置合成模式
ctx.globalCompositeOperation = 'lighter'

// 绑制内容
ctx.fillRect(0, 0, 200, 200)

合成模式概览

Canvas提供了多种合成模式,分为以下几类:

类别模式说明
基础source-over默认模式,新图形覆盖
擦除destination-out用新图形擦除已有内容
混合lighter颜色相加变亮
混合multiply颜色相乘变暗
混合screen屏幕混合
混合overlay叠加混合
混合darken取较暗颜色
混合lighten取较亮颜色
遮罩source-in只显示重叠部分
遮罩source-atop只显示重叠和已有部分
遮罩destination-in只显示重叠部分(已有内容)
遮罩destination-atop只显示重叠和新内容部分

方法概览

方法/属性说明
globalCompositeOperation设置合成模式
globalAlpha设置全局透明度
clip()设置裁剪路径
clip(path)使用Path2D设置裁剪路径

合成操作演示

常用合成模式对比

裁剪路径演示

裁剪路径效果

实际应用

1. 橡皮擦效果

ctx.globalCompositeOperation = 'destination-out'
ctx.beginPath()
ctx.arc(x, y, radius, 0, Math.PI * 2)
ctx.fill()

2. 图像遮罩

ctx.drawImage(image, 0, 0)
ctx.globalCompositeOperation = 'source-in'
ctx.drawImage(mask, 0, 0)

3. 发光效果

ctx.globalCompositeOperation = 'lighter'
ctx.shadowBlur = 20
ctx.shadowColor = '#fff'
ctx.fillText('Glow', 100, 100)

注意事项

合成模式顺序

合成模式只影响之后的绑制,不影响已有内容。

裁剪路径累积

多次调用clip会累积裁剪区域,使用save/restore重置。

性能考虑

某些合成模式可能影响性能,谨慎使用。

浏览器兼容

大部分现代浏览器支持所有合成模式,但建议测试。