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


四个入口均已完成格式和尺寸校验;不同 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) }}import sharp from 'sharp';
try { await sharp('input.jpg') .webp({ quality: 82 }) .toFile('output.webp');} catch (error) { console.error(error); process.exitCode = 1;}import sysimport pyvips
try: image = pyvips.Image.new_from_file("input.jpg", access="sequential") image.write_to_file("output.webp", Q=82)except pyvips.Error as error: print(error, file=sys.stderr) raise SystemExit(1) from error#!/usr/bin/env bashset -euo pipefail
vips copy input.jpg 'output.webp[Q=82]'不只是改扩展名
Section titled “不只是改扩展名”格式转换包含解码与重新编码。输出质量、元数据、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。尺寸对齐不代表编码结果逐字节相同。