mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 18:04:04 -05:00
55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
/*
|
|
Copyright (c) 2012, Jan Schlicht <jan.schlicht@gmail.com>
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
with or without fee is hereby granted, provided that the above copyright notice
|
|
and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
THIS SOFTWARE.
|
|
*/
|
|
|
|
package resize
|
|
|
|
import (
|
|
"image"
|
|
)
|
|
|
|
// Thumbnail will downscale provided image to max width and height preserving
|
|
// original aspect ratio and using the interpolation function interp.
|
|
// It will return original image, without processing it, if original sizes
|
|
// are already smaller than provided constraints.
|
|
func Thumbnail(maxWidth, maxHeight uint, img image.Image, interp InterpolationFunction) image.Image {
|
|
origBounds := img.Bounds()
|
|
origWidth := uint(origBounds.Dx())
|
|
origHeight := uint(origBounds.Dy())
|
|
newWidth, newHeight := origWidth, origHeight
|
|
|
|
// Return original image if it have same or smaller size as constraints
|
|
if maxWidth >= origWidth && maxHeight >= origHeight {
|
|
return img
|
|
}
|
|
|
|
// Preserve aspect ratio
|
|
if origWidth > maxWidth {
|
|
newHeight = uint(origHeight * maxWidth / origWidth)
|
|
if newHeight < 1 {
|
|
newHeight = 1
|
|
}
|
|
newWidth = maxWidth
|
|
}
|
|
|
|
if newHeight > maxHeight {
|
|
newWidth = uint(newWidth * maxHeight / newHeight)
|
|
if newWidth < 1 {
|
|
newWidth = 1
|
|
}
|
|
newHeight = maxHeight
|
|
}
|
|
return Resize(newWidth, newHeight, img, interp)
|
|
}
|