From dccfe80349cc2908ff1401becf14e187d50e8b3c Mon Sep 17 00:00:00 2001 From: DarthSim Date: Wed, 4 Jun 2025 20:20:20 +0300 Subject: [PATCH] Fix the `extend` processing option when only one dimension is set --- CHANGELOG.md | 1 + processing/extend.go | 34 +++++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bfef064..a85abf8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ### Fixed - Fix `X-Origin-Content-Length` header value when SVG is sanitized or minified. - Mark JPEG XL format as supporting quality. Fixes autoquality for JPEG XL. +- Fix the `extend` processing option when only one dimension is set. - (pro) Fix object detection when the `IMGPROXY_USE_LINEAR_COLORSPACE` config is set to `true`. - (pro) Fix BlurHash generation when the `IMGPROXY_USE_LINEAR_COLORSPACE` config is set to `true`. - (pro) Fix detection of PDF files with a header offset. diff --git a/processing/extend.go b/processing/extend.go index b9dd5501..c3ff1e77 100644 --- a/processing/extend.go +++ b/processing/extend.go @@ -8,22 +8,38 @@ import ( ) func extendImage(img *vips.Image, resultWidth, resultHeight int, opts *options.ExtendOptions, offsetScale float64, extendAr bool) error { - if !opts.Enabled || (resultWidth <= img.Width() && resultHeight <= img.Height()) || resultWidth == 0 || resultHeight == 0 { + imgWidth := img.Width() + imgHeight := img.Height() + + if !opts.Enabled || (resultWidth <= imgWidth && resultHeight <= imgHeight) { return nil } - if extendAr && resultWidth > img.Width() && resultHeight > img.Height() { - diffW := float64(resultWidth) / float64(img.Width()) - diffH := float64(resultHeight) / float64(img.Height()) + if resultWidth <= 0 { + if extendAr { + return nil + } + resultWidth = imgWidth + } + if resultHeight <= 0 { + if extendAr { + return nil + } + resultHeight = imgHeight + } + + if extendAr && resultWidth > imgWidth && resultHeight > imgHeight { + diffW := float64(resultWidth) / float64(imgWidth) + diffH := float64(resultHeight) / float64(imgHeight) switch { case diffH > diffW: - resultHeight = imath.Scale(img.Width(), float64(resultHeight)/float64(resultWidth)) - resultWidth = img.Width() + resultHeight = imath.Scale(imgWidth, float64(resultHeight)/float64(resultWidth)) + resultWidth = imgWidth case diffW > diffH: - resultWidth = imath.Scale(img.Height(), float64(resultWidth)/float64(resultHeight)) - resultHeight = img.Height() + resultWidth = imath.Scale(imgHeight, float64(resultWidth)/float64(resultHeight)) + resultHeight = imgHeight default: // The image has the requested arpect ratio @@ -31,7 +47,7 @@ func extendImage(img *vips.Image, resultWidth, resultHeight int, opts *options.E } } - offX, offY := calcPosition(resultWidth, resultHeight, img.Width(), img.Height(), &opts.Gravity, offsetScale, false) + offX, offY := calcPosition(resultWidth, resultHeight, imgWidth, imgHeight, &opts.Gravity, offsetScale, false) return img.Embed(resultWidth, resultHeight, offX, offY) }