亮度、饱和度与色相调整
这三个操作都改变像素外观,但语义并不相同:亮度改变明暗,饱和度改变色彩强度,色相改变色轮上的角度位置。下面每节讨论一个变体,结果图和代码均来自同一组实际执行的测试。

参考输出由 govips v2.19.0 / libvips 8.17.3 生成。pyvips 与 CLI 没有直接的单函数饱和度/色相调制入口,对应状态标记为 not-supported。
govips.Modulate(1.25, 1, 0) 在 LCh 色彩空间中提高亮度;sharp 使用 HSL 语义。pyvips 与 CLI 示例使用 RGB 线性乘法,属于近似调整而非像素等价实现。


由 govips v2.19.0 / libvips 8.17.3 实际生成。
image, err := vips.NewImageFromFile("input.jpg")if err != nil { return err }defer image.Close()if err := image.Modulate(1.25, 1, 0); err != nil { return err }data, _, err := image.ExportWebp(vips.NewWebpExportParams())if err != nil { return err }return os.WriteFile("brightness.webp", data, 0o644)await sharp('input.jpg').modulate({ brightness: 1.25 }).webp({ quality: 82 }).toFile('brightness.webp');image = pyvips.Image.new_from_file("input.jpg")bright = image.linear([1.25, 1.25, 1.25], [0, 0, 0])bright.write_to_file("brightness.webp", Q=82)vips linear input.jpg 'brightness.webp[Q=82]' 1.25 0govips 和 sharp 提供直接的 Modulate / modulate 入口。pyvips 与 CLI 没有内置的单步调制封装,因此在下方标注为无直接等价高层入口,不用原图复制冒充饱和度变换。


由 govips v2.19.0 / libvips 8.17.3 实际生成。
if err := image.Modulate(1, 0.35, 0); err != nil { return err }await sharp('input.jpg').modulate({ saturation: 0.35 }).webp({ quality: 82 }).toFile('saturation.webp');# pyvips 没有单步 modulate 辅助函数;需转换到 LCh 色彩空间、按比例缩放 C 通道再转回 sRGB。# 当前状态标记为 not-supported。# vips CLI 没有单条 modulate 命令;需串联 colourspace lch、linear 与 colourspace srgb。# 当前状态标记为 not-supported。色相是角度偏移,60 表示旋转 60 度。govips 的 Modulate 在 LCh 色彩空间中处理,而 sharp 在内部使用 LCh/HSL 调制语义,相同参数数值不保证产生相同像素。


由 govips v2.19.0 / libvips 8.17.3 实际生成。
if err := image.Modulate(1, 1, 60); err != nil { return err }await sharp('input.jpg').modulate({ hue: 60 }).webp({ quality: 82 }).toFile('hue.webp');# 需要手动完成 sRGB → LCh → 调整 H 通道 → sRGB 往返转换;当前状态标记为 not-supported。# 需要串联 colourspace lch → 调整色相通道 → colourspace srgb;当前状态标记为 not-supported。