跳转到内容

亮度、饱和度与色相调整

复制本页

这三个操作都改变像素外观,但不是同一件事:亮度改变明暗,饱和度改变色彩强度,色相改变色轮上的位置。下面每节只讨论一个变体,图片和代码来自同一个 Recipe。

用于色彩调整的苏州东方之门夜景原图
输入:JPEG1938 × 1292,嵌入 sRGB ICC

参考输出由 govips v2.19.0 / libvips 8.17.3 生成。四个 binding 都有对应输出;pyvips 与 CLI 的饱和度、色相文件目前是原图占位,状态为 not-supported,不应当当作调整结果。

govips.Modulate(1.25, 1, 0) 在 LCh 中提高亮度;sharp 使用 HSL 语义。pyvips 与 CLI 示例使用 RGB 线性乘法,是近似而非像素等价实现。

用于色彩调整的苏州东方之门夜景原图
原图 · JPEG
亮度提高后的苏州东方之门夜景
亮度调整 · WEBP1938 × 1292, 490,880 bytes, 3 bands

Generated with 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)

govips 和 sharp 有直接的调制入口。当前 pyvips 与 CLI 会保留输入并在结果清单中标记 not-supported;这表示流程可运行,但没有声称已经完成饱和度变换。

用于色彩调整的苏州东方之门夜景原图
原图 · JPEG
饱和度降低后的苏州东方之门夜景
饱和度调整 · WEBP1938 × 1292, 374,512 bytes, 3 bands

Generated with govips v2.19.0 / libvips 8.17.3.

if err := image.Modulate(1, 0.35, 0); err != nil { return err }

色相是角度偏移,60 表示旋转 60 度。govips 的 Modulate 在 LCh 中处理;sharp 的实现使用 HSL,因此相同数字不保证得到相同像素。

用于色彩调整的苏州东方之门夜景原图
原图 · JPEG
色相旋转后的苏州东方之门夜景
色相调整 · WEBP1938 × 1292, 393,624 bytes, 3 bands

Generated with govips v2.19.0 / libvips 8.17.3.

if err := image.Modulate(1, 1, 60); err != nil { return err }