跳转到内容

缩放:fit、cover 与裁剪位置

复制本页

缩放要先选定画布,再选定裁剪。fit inside 把整张图放进 400 × 400,不放大小图。cover 把结果铺满 600 × 300,这张横图因此要从上下裁掉一条。裁切点可以是中心、靠上的一边,或熵较高的区域。正方形 cover 只会裁左右,north 不会改变画面,所以这里用更宽的目标来露出上方裁剪。

几何合集里的固定坐标裁剪和任意角度旋转不是这一页。那一组操作见缩放、裁剪、旋转与翻转。

用于 fit 与 cover 的苏州东方之门夜景原图
输入:JPEG1938 × 1292

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

缩小到 400 像素边界内的夜景
fit inside400 × 267, 14,990 bytes
以中心裁成 600×300 的夜景
cover centre600 × 300, 30,842 bytes
保留上方并裁成 600×300 的夜景
cover north600 × 300, 26,506 bytes
按熵裁成 600×300 的夜景
cover entropy600 × 300, 30,600 bytes
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)

fit 为 400 × 267,三张 cover 为 600 × 300,均为 3 通道且没有 Alpha。sharp 使用自带的 libvips 8.18.7,其余三个使用 8.17.3。熵裁剪依赖图像内容,同一次运行的窗口不能写成固定坐标。

访问模式决定大图缩略图能不能留在顺序路径,见顺序访问、随机访问与实体化。