Add: thumbnail helper function
This commit is contained in:
parent
f8ec710330
commit
b744503c5c
55
thumbnail.go
Normal file
55
thumbnail.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
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)
|
||||
}
|
47
thumbnail_test.go
Normal file
47
thumbnail_test.go
Normal file
|
@ -0,0 +1,47 @@
|
|||
package resize
|
||||
|
||||
import (
|
||||
"image"
|
||||
"runtime"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func init() {
|
||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||
}
|
||||
|
||||
var thumbnailTests = []struct {
|
||||
origWidth int
|
||||
origHeight int
|
||||
maxWidth uint
|
||||
maxHeight uint
|
||||
expectedWidth uint
|
||||
expectedHeight uint
|
||||
}{
|
||||
{5, 5, 10, 10, 5, 5},
|
||||
{10, 10, 5, 5, 5, 5},
|
||||
{10, 50, 10, 10, 2, 10},
|
||||
{50, 10, 10, 10, 10, 2},
|
||||
{50, 100, 60, 90, 45, 90},
|
||||
{120, 100, 60, 90, 60, 50},
|
||||
{200, 250, 200, 150, 120, 150},
|
||||
}
|
||||
|
||||
func TestThumbnail(t *testing.T) {
|
||||
for i, tt := range thumbnailTests {
|
||||
img := image.NewGray16(image.Rect(0, 0, tt.origWidth, tt.origHeight))
|
||||
|
||||
outImg := Thumbnail(tt.maxWidth, tt.maxHeight, img, NearestNeighbor)
|
||||
|
||||
newWidth := uint(outImg.Bounds().Dx())
|
||||
newHeight := uint(outImg.Bounds().Dy())
|
||||
if newWidth != tt.expectedWidth ||
|
||||
newHeight != tt.expectedHeight {
|
||||
t.Errorf("%d. Thumbnail(%v, %v, img, NearestNeighbor) => "+
|
||||
"width: %v, height: %v, want width: %v, height: %v",
|
||||
i, tt.maxWidth, tt.maxHeight,
|
||||
newWidth, newHeight, tt.expectedWidth, tt.expectedHeight,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user