跳转到内容

读取、导出与格式转换

复制本页

输入文件是 input.jpg,输出文件是 output.webp。下面的代码展示四个常用入口的实现结构;参考输出由 govips 实际生成并完成格式与尺寸校验。

夜色中亮起红色轮廓灯的苏州东方之门建筑与前景步道
输入:JPEG1938 × 1292,610,191 字节
保持原尺寸并转换为 WebP 的苏州东方之门夜景
参考输出:WebP1938 × 1292,399,106 字节,quality 82

四个入口均已完成格式和尺寸校验;不同 libvips 版本产生的编码字节不要求完全一致。

package main
import (
"fmt"
"os"
"github.com/davidbyttow/govips/v2/vips"
)
func main() {
if err := vips.Startup(nil); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
defer vips.Shutdown()
image, err := vips.NewImageFromFile("input.jpg")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
defer image.Close()
params := vips.NewWebpExportParams()
params.Quality = 82
data, _, err := image.ExportWebp(params)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
if err := os.WriteFile("output.webp", data, 0o644); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

格式转换包含解码与重新编码。输出质量、元数据、ICC 配置文件(ICC Profile)、Alpha 通道、动画页数和编码器可用性都可能变化。Quality = 100 或 Q=100 也不等于无损模式;无损编码需要单独开启 Lossless 选项。

同一张 1938 × 1292 JPEG、WebP quality 82,2026-10-12 的四份输出尺寸都是 1938 × 1292、3 通道、无 Alpha 通道。字节数存在差异:govips 为 399,106,sharp 为 398,898,pyvips 与 CLI 均为 402,162。sharp 使用随包捆绑的 libvips 8.18.7,另外三个入口使用系统 libvips 8.17.3。尺寸对齐不代表编码结果逐字节相同。