跳转到内容

通道、Alpha 与像素组合

复制本页

通道不是抽象的“颜色数组”。下面每项操作先展示实际生成的输出,紧接着给出生成它的各入口代码。

输出为单通道(1 band)PNG,以灰度表示原图红色通道的强度。

以灰度显示红色通道强度的通道测试图
红色通道 · PNG640 × 360,4,693 字节,1 通道

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

if err := image.ExtractBand(0, 1); err != nil { return err }
return exportPNG(image, "red-channel.png")

Alpha 通道被导出为单通道 PNG,便于直接检查遮罩本身,而不是把它当作 RGB 图像。

以灰度显示透明度的 Alpha 通道测试图
Alpha 通道 · PNG640 × 360,5,301 字节,1 通道

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

if err := image.ExtractBand(3, 1); err != nil { return err }
return exportPNG(image, "alpha-channel.png")

govips 代码显式拆分通道并调用 BandJoin;sharp 的 ensureAlpha() 保证输出包含 Alpha 通道,但并非同名的逐通道组合 API,两种语义不应视为完全等价。

重新组合颜色与 Alpha 通道后的透明测试图
重新组合 RGBA · PNG640 × 360,10,175 字节,含 Alpha,4 通道

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

bands, err := image.BandSplit()
if err != nil { return err }
defer closeAll(bands)
if err := bands[0].BandJoin(bands[1:]...); err != nil { return err }
return exportPNG(bands[0], "rebuilt-rgba.png")

以 #f8fafc 背景色展平(flatten)后导出为 WebP;导出到不支持透明通道的格式前,应明确指定背景色。

在浅色背景上展平透明度后的通道测试图
展平透明度 · WEBP640 × 360,3,672 字节,3 通道

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

if err := image.Flatten(&vips.Color{R: 248, G: 250, B: 252}); err != nil { return err }
return exportWebp(image, "flattened.webp")

sharp 还提供 threshold()、boolean()、dilate()、erode() 等高层入口。govips 当前公开包装层没有这些同名方法,因此本页不把它们伪装成跨绑定等价操作。