diff --git a/docs/generating_the_url_advanced.md b/docs/generating_the_url_advanced.md index dd245b39..a1a5ae50 100644 --- a/docs/generating_the_url_advanced.md +++ b/docs/generating_the_url_advanced.md @@ -59,7 +59,8 @@ rt:%resizing_type Defines how imgproxy will resize the source image. Supported resizing types are: * `fit`: resizes the image while keeping aspect ratio to fit given size; -* `fill`: resizes the image while keeping aspect ratio to fill given size and cropping projecting parts. +* `fill`: resizes the image while keeping aspect ratio to fill given size and cropping projecting parts; +* `auto`: if both source and resulting dimensions have the same orientation (portrait or landscape), imgproxy will use `fill`. Otherwise, it will use `fit`. Default: `fit` diff --git a/docs/generating_the_url_basic.md b/docs/generating_the_url_basic.md index baef7218..18347ad4 100644 --- a/docs/generating_the_url_basic.md +++ b/docs/generating_the_url_basic.md @@ -24,7 +24,8 @@ Once you set up your [URL signature](./configuration.md#url-signature), check ou imgproxy supports the following resizing types: * `fit`: resizes the image while keeping aspect ratio to fit given size; -* `fill`: resizes the image while keeping aspect ratio to fill given size and cropping projecting parts. +* `fill`: resizes the image while keeping aspect ratio to fill given size and cropping projecting parts; +* `auto`: if both source and resulting dimensions have the same orientation (portrait or landscape), imgproxy will use `fill`. Otherwise, it will use `fit`. #### Width and height diff --git a/process.go b/process.go index 870eee11..50c8ee8b 100644 --- a/process.go +++ b/process.go @@ -49,11 +49,24 @@ func calcScale(width, height int, po *processingOptions, imgtype imageType) floa wr := float64(po.Width) / srcW hr := float64(po.Height) / srcH + rt := po.Resize + + if rt == resizeAuto { + srcD := width - height + dstD := po.Width - po.Height + + if (srcD >= 0 && dstD >= 0) || (srcD < 0 && dstD < 0) { + rt = resizeFill + } else { + rt = resizeFit + } + } + if po.Width == 0 { scale = hr } else if po.Height == 0 { scale = wr - } else if po.Resize == resizeFit { + } else if rt == resizeFit { scale = math.Min(wr, hr) } else { scale = math.Max(wr, hr) diff --git a/processing_options.go b/processing_options.go index 1ea8366d..16696e64 100644 --- a/processing_options.go +++ b/processing_options.go @@ -58,12 +58,14 @@ const ( resizeFit resizeType = iota resizeFill resizeCrop + resizeAuto ) var resizeTypes = map[string]resizeType{ "fit": resizeFit, "fill": resizeFill, "crop": resizeCrop, + "auto": resizeAuto, } type rgbColor struct{ R, G, B uint8 }