mirror of
https://github.com/willnorris/imageproxy.git
synced 2025-03-11 02:19:14 -05:00
add tests for transformImage
This commit is contained in:
parent
882c2b3782
commit
dd1df4631b
2 changed files with 144 additions and 3 deletions
|
@ -27,6 +27,9 @@ import (
|
||||||
// compression quality of resized jpegs
|
// compression quality of resized jpegs
|
||||||
const jpegQuality = 95
|
const jpegQuality = 95
|
||||||
|
|
||||||
|
// resample filter used when resizing images
|
||||||
|
var resampleFilter = imaging.Lanczos
|
||||||
|
|
||||||
// Transform the provided image. img should contain the raw bytes of an
|
// Transform the provided image. img should contain the raw bytes of an
|
||||||
// encoded image in one of the supported formats (gif, jpeg, or png). The
|
// encoded image in one of the supported formats (gif, jpeg, or png). The
|
||||||
// bytes of a similarly encoded image is returned.
|
// bytes of a similarly encoded image is returned.
|
||||||
|
@ -91,12 +94,12 @@ func transformImage(m image.Image, opt Options) image.Image {
|
||||||
// resize
|
// resize
|
||||||
if w != 0 || h != 0 {
|
if w != 0 || h != 0 {
|
||||||
if opt.Fit {
|
if opt.Fit {
|
||||||
m = imaging.Fit(m, w, h, imaging.Lanczos)
|
m = imaging.Fit(m, w, h, resampleFilter)
|
||||||
} else {
|
} else {
|
||||||
if w == 0 || h == 0 {
|
if w == 0 || h == 0 {
|
||||||
m = imaging.Resize(m, w, h, imaging.Lanczos)
|
m = imaging.Resize(m, w, h, resampleFilter)
|
||||||
} else {
|
} else {
|
||||||
m = imaging.Thumbnail(m, w, h, imaging.Lanczos)
|
m = imaging.Thumbnail(m, w, h, resampleFilter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
138
transform_test.go
Normal file
138
transform_test.go
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
package imageproxy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"image"
|
||||||
|
"image/color"
|
||||||
|
"image/draw"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/disintegration/imaging"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
red = color.NRGBA{255, 0, 0, 255}
|
||||||
|
green = color.NRGBA{0, 255, 0, 255}
|
||||||
|
blue = color.NRGBA{0, 0, 255, 255}
|
||||||
|
yellow = color.NRGBA{255, 255, 0, 255}
|
||||||
|
)
|
||||||
|
|
||||||
|
// newImage creates a new NRGBA image with the specified dimensions and pixel
|
||||||
|
// color data. If the length of pixels is 1, the entire image is filled with
|
||||||
|
// that color.
|
||||||
|
func newImage(w, h int, pixels ...color.NRGBA) image.Image {
|
||||||
|
m := image.NewNRGBA(image.Rect(0, 0, w, h))
|
||||||
|
if len(pixels) == 1 {
|
||||||
|
draw.Draw(m, m.Bounds(), &image.Uniform{pixels[0]}, image.ZP, draw.Src)
|
||||||
|
} else {
|
||||||
|
for i, p := range pixels {
|
||||||
|
m.Set(i%w, i/w, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTransformImage(t *testing.T) {
|
||||||
|
// ref is a 2x2 reference image containing four colors
|
||||||
|
ref := newImage(2, 2, red, green, blue, yellow)
|
||||||
|
|
||||||
|
// use simpler filter while testing that won't skew colors
|
||||||
|
resampleFilter = imaging.Box
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
src image.Image // source image to transform
|
||||||
|
opt Options // options to apply during transform
|
||||||
|
want image.Image // expected transformed image
|
||||||
|
}{
|
||||||
|
// no transformation
|
||||||
|
{ref, emptyOptions, ref},
|
||||||
|
|
||||||
|
// rotations
|
||||||
|
{ref, Options{Rotate: 45}, ref}, // invalid rotation is a noop
|
||||||
|
{ref, Options{Rotate: 90}, newImage(2, 2, green, yellow, red, blue)},
|
||||||
|
{ref, Options{Rotate: 180}, newImage(2, 2, yellow, blue, green, red)},
|
||||||
|
{ref, Options{Rotate: 270}, newImage(2, 2, blue, red, yellow, green)},
|
||||||
|
|
||||||
|
// flips
|
||||||
|
{
|
||||||
|
ref,
|
||||||
|
Options{FlipHorizontal: true},
|
||||||
|
newImage(2, 2, green, red, yellow, blue),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ref,
|
||||||
|
Options{FlipVertical: true},
|
||||||
|
newImage(2, 2, blue, yellow, red, green),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ref,
|
||||||
|
Options{FlipHorizontal: true, FlipVertical: true},
|
||||||
|
newImage(2, 2, yellow, blue, green, red),
|
||||||
|
},
|
||||||
|
|
||||||
|
// resizing
|
||||||
|
{ // can't resize larger than original image
|
||||||
|
ref,
|
||||||
|
Options{Width: 100, Height: 100},
|
||||||
|
ref,
|
||||||
|
},
|
||||||
|
{ // invalid values
|
||||||
|
ref,
|
||||||
|
Options{Width: -1, Height: -1},
|
||||||
|
ref,
|
||||||
|
},
|
||||||
|
{ // absolute values
|
||||||
|
newImage(100, 100, red),
|
||||||
|
Options{Width: 1, Height: 1},
|
||||||
|
newImage(1, 1, red),
|
||||||
|
},
|
||||||
|
{ // percentage values
|
||||||
|
newImage(100, 100, red),
|
||||||
|
Options{Width: 0.50, Height: 0.25},
|
||||||
|
newImage(50, 25, red),
|
||||||
|
},
|
||||||
|
{ // only width specified, proportional height
|
||||||
|
newImage(100, 50, red),
|
||||||
|
Options{Width: 50},
|
||||||
|
newImage(50, 25, red),
|
||||||
|
},
|
||||||
|
{ // only height specified, proportional width
|
||||||
|
newImage(100, 50, red),
|
||||||
|
Options{Height: 25},
|
||||||
|
newImage(50, 25, red),
|
||||||
|
},
|
||||||
|
{ // resize in one dimenstion, with cropping
|
||||||
|
newImage(4, 2, red, red, blue, blue, red, red, blue, blue),
|
||||||
|
Options{Width: 4, Height: 1},
|
||||||
|
newImage(4, 1, red, red, blue, blue),
|
||||||
|
},
|
||||||
|
{ // resize in two dimensions, with cropping
|
||||||
|
newImage(4, 2, red, red, blue, blue, red, red, blue, blue),
|
||||||
|
Options{Width: 2, Height: 2},
|
||||||
|
newImage(2, 2, red, blue, red, blue),
|
||||||
|
},
|
||||||
|
{ // resize in two dimensions, fit option prevents cropping
|
||||||
|
newImage(4, 2, red, red, blue, blue, red, red, blue, blue),
|
||||||
|
Options{Width: 2, Height: 2, Fit: true},
|
||||||
|
newImage(2, 1, red, blue),
|
||||||
|
},
|
||||||
|
{ // scale image explicitly
|
||||||
|
newImage(4, 2, red, red, blue, blue, red, red, blue, blue),
|
||||||
|
Options{Width: 2, Height: 1},
|
||||||
|
newImage(2, 1, red, blue),
|
||||||
|
},
|
||||||
|
|
||||||
|
// combinations of options
|
||||||
|
{
|
||||||
|
newImage(4, 2, red, red, blue, blue, red, red, blue, blue),
|
||||||
|
Options{Width: 2, Height: 1, Fit: true, FlipHorizontal: true, Rotate: 90},
|
||||||
|
newImage(1, 2, red, blue),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
if got := transformImage(tt.src, tt.opt); !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("trasformImage(%v, %v) returned image %#v, want %#v", tt.src, tt.opt, got, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue