跳转到内容

多图层合成与混合模式

复制本页

合成(compositing)指把多张图像叠放在一起,并定义它们在重叠区域的像素如何相互作用。这种交互由**混合模式(blend mode)**控制:over 利用 Alpha 通道把上层图像覆盖到下层;multiply 按通道相乘,使两层内容都保持可见。本节把半透明 WebP Cloud 标识叠加到照片中央,分别以 over 和 multiply 导出为 WebP。

基底是输入照片;叠加层是程序生成的 WebP Cloud 标识,居中放置。

作为合成基底使用的苏州东方之门夜景照片
基底 · JPEG1938 × 1292,3 通道
作为合成叠加层使用的半透明 WebP Cloud 标识
WebP Cloud 叠加层 · SVG220 × 72,透明背景

over 是默认也是最常用的模式:叠加层在 Alpha 非零处替换下方像素。将 WebP Cloud 标识居中放置,便于在不同混合模式之间对齐对比。

中央叠加 WebP Cloud 标识的苏州东方之门夜景照片
Over 混合 · WEBP1938 × 1292,397,690 字节,3 通道

由 govips v2.19.0 / libvips 8.17.3 实际生成。

base, err := vips.NewImageFromFile(inputPath)
if err != nil {
return err
}
overlay, err := vips.NewImageFromFile(overlayPath)
if err != nil {
return err
}
if err := overlay.PremultiplyAlpha(); err != nil {
return err
}
x := (base.Width() - overlay.Width()) / 2
y := (base.Height() - overlay.Height()) / 2
if err := base.Composite(overlay, vips.BlendModeOver, x, y); err != nil {
return err
}
if err := base.Flatten(&vips.Color{R: 29, G: 45, B: 53}); err != nil {
return err
}
data, _, err := base.ExportWebp(vips.NewWebpExportParams())

multiply 把一张图像的每个通道乘以另一张图像的对应通道,因此重叠区域保持可见并整体变暗。注意同一叠加层在 multiply 下与 over 产生了明显的视觉差异。

WebP Cloud 标识以 Multiply 模式融入中央的苏州东方之门夜景照片
Multiply 混合 · WEBP1938 × 1292,397,690 字节,3 通道

由 govips v2.19.0 / libvips 8.17.3 实际生成。

base, err := vips.NewImageFromFile(inputPath)
if err != nil {
return err
}
overlay, err := vips.NewImageFromFile(overlayPath)
if err != nil {
return err
}
if err := overlay.PremultiplyAlpha(); err != nil {
return err
}
x := (base.Width() - overlay.Width()) / 2
y := (base.Height() - overlay.Height()) / 2
if err := base.Composite(overlay, vips.BlendModeMultiply, x, y); err != nil {
return err
}
if err := base.Flatten(&vips.Color{R: 29, G: 45, B: 53}); err != nil {
return err
}
data, _, err := base.ExportWebp(vips.NewWebpExportParams())

混合模式的基础集合来自 libvips 的 VipsBlendMode 枚举,但各入口的呈现方式不同:

  • govips 使用类型化的 Go 常量:vips.BlendModeOver、vips.BlendModeMultiply。
  • sharp 使用小写字符串:'over'、'multiply' 等 20 余种。
  • pyvips 在 composite2 中接受字符串模式:"over"、"multiply"。
  • vips CLI 把同一枚举名作为第四个位置参数。

由于这些模式映射到同一底层枚举,产品意图是可移植的;但不能把一个入口里的模式名直接复制到另一个入口而不做映射。参考资料中的常用操作跨绑定映射与默认参数差异集中列出了这些对照关系。