mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-08-21 12:08:54 +02:00
56 lines
1.8 KiB
Go
56 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)
|
||
|
}
|