缩放:fit、cover 与裁剪位置
缩放要先选定画布,再选定裁剪。fit inside 把整张图放进 400 × 400,不放大小图。cover 把结果铺满 600 × 300,这张横图因此要从上下裁掉一条。裁切点可以是中心、靠上的一边,或熵较高的区域。正方形 cover 只会裁左右,north 不会改变画面,所以这里用更宽的目标来露出上方裁剪。
几何合集里的固定坐标裁剪和任意角度旋转不是这一页。那一组操作见缩放、裁剪、旋转与翻转。

参考图由 govips v2.19.0 通过缩略图接口生成,libvips 8.17.3,WebP quality 82,且不允许放大。north 在 libvips 里对应 crop=low:这条更宽的目标裁的是上下方向,低坐标就是保留上方。sharp 使用 position: "north" 表达同一个产品意图。




if err := vips.Startup(nil); err != nil { return err }defer vips.Shutdown()
write := func(name string, width, height int, crop vips.Interesting) error { image, err := vips.NewThumbnailWithSizeFromFile("input.jpg", width, height, crop, vips.SizeDown) if err != nil { return err } defer image.Close() params := vips.NewWebpExportParams() params.Quality = 82 data, _, err := image.ExportWebp(params) if err != nil { return err } return os.WriteFile(name, data, 0o644)}if err := write("fit-inside.webp", 400, 400, vips.InterestingNone); err != nil { return err }if err := write("cover-centre.webp", 600, 300, vips.InterestingCentre); err != nil { return err }if err := write("cover-north.webp", 600, 300, vips.InterestingLow); err != nil { return err }return write("cover-entropy.webp", 600, 300, vips.InterestingEntropy)const jobs = [ ['fit-inside.webp', { width: 400, height: 400, fit: 'inside', withoutEnlargement: true }], ['cover-centre.webp', { width: 600, height: 300, fit: 'cover', position: 'centre', withoutEnlargement: true }], ['cover-north.webp', { width: 600, height: 300, fit: 'cover', position: 'north', withoutEnlargement: true }], ['cover-entropy.webp', { width: 600, height: 300, fit: 'cover', position: 'entropy', withoutEnlargement: true }],];for (const [name, resize] of jobs) { await sharp('input.jpg').resize(resize).webp({ quality: 82 }).toFile(name);}jobs = [ ("fit-inside.webp", "none", 400, 400), ("cover-centre.webp", "centre", 600, 300), ("cover-north.webp", "low", 600, 300), ("cover-entropy.webp", "entropy", 600, 300),]for name, crop, width, height in jobs: image = pyvips.Image.thumbnail("input.jpg", width, height=height, size="down", crop=crop) image.write_to_file(name, Q=82)vips thumbnail input.jpg 'fit-inside.webp[Q=82]' 400 --height 400 --size down --crop nonevips thumbnail input.jpg 'cover-centre.webp[Q=82]' 600 --height 300 --size down --crop centrevips thumbnail input.jpg 'cover-north.webp[Q=82]' 600 --height 300 --size down --crop lowvips thumbnail input.jpg 'cover-entropy.webp[Q=82]' 600 --height 300 --size down --crop entropyfit 为 400 × 267,三张 cover 为 600 × 300,均为 3 通道且没有 Alpha。sharp 使用自带的 libvips 8.18.7,其余三个使用 8.17.3。熵裁剪依赖图像内容,同一次运行的窗口不能写成固定坐标。
访问模式决定大图缩略图能不能留在顺序路径,见顺序访问、随机访问与实体化。