From dc3286965befa97cfbcfc4f1ed81c1172ff1d26a Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Tue, 4 Jul 2017 11:33:13 +1000 Subject: [PATCH] Use vips reduce when downscaling --- resize.go | 6 +++++- vips.go | 12 ++++++++++++ vips.h | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/resize.go b/resize.go index 93d6248..c8c7be0 100644 --- a/resize.go +++ b/resize.go @@ -198,7 +198,11 @@ func transformImage(image *C.VipsImage, o Options, shrink int, residual float64) } if o.Force || residual != 0 { - image, err = vipsAffine(image, residualx, residualy, o.Interpolator) + if residualx < 1 && residualy < 1 { + image, err = vipsReduce(image, 1/residualx, 1/residualy) + } else { + image, err = vipsAffine(image, residualx, residualy, o.Interpolator) + } if err != nil { return nil, err } diff --git a/vips.go b/vips.go index 221233f..7c087ee 100644 --- a/vips.go +++ b/vips.go @@ -513,6 +513,18 @@ func vipsShrink(input *C.VipsImage, shrink int) (*C.VipsImage, error) { return image, nil } +func vipsReduce(input *C.VipsImage, xshrink float64, yshrink float64) (*C.VipsImage, error) { + var image *C.VipsImage + defer C.g_object_unref(C.gpointer(input)) + + err := C.vips_reduce_bridge(input, &image, C.double(xshrink), C.double(yshrink)) + if err != 0 { + return nil, catchVipsError() + } + + return image, nil +} + func vipsEmbed(input *C.VipsImage, left, top, width, height int, extend Extend, background Color) (*C.VipsImage, error) { var image *C.VipsImage diff --git a/vips.h b/vips.h index 6d76550..b1aa7ef 100644 --- a/vips.h +++ b/vips.h @@ -122,6 +122,11 @@ vips_shrink_bridge(VipsImage *in, VipsImage **out, double xshrink, double yshrin return vips_shrink(in, out, xshrink, yshrink, NULL); } +int +vips_reduce_bridge(VipsImage *in, VipsImage **out, double xshrink, double yshrink) { + return vips_reduce(in, out, xshrink, yshrink, NULL); +} + int vips_type_find_bridge(int t) { if (t == GIF) {