diff --git a/data/data.go b/data/data.go index 2fab83a..8575028 100644 --- a/data/data.go +++ b/data/data.go @@ -12,8 +12,8 @@ import ( // Options specifies transformations that can be performed on a // requested image. type Options struct { - Width int // requested width, in pixels - Height int // requested height, in pixels + Width float64 // requested width, in pixels + Height float64 // requested height, in pixels // If true, resize the image to fit in the specified dimensions. Image // will not be cropped, and aspect ratio will be maintained. @@ -21,7 +21,7 @@ type Options struct { } func (o Options) String() string { - return fmt.Sprintf("%dx%d", o.Width, o.Height) + return fmt.Sprintf("%vx%v", o.Width, o.Height) } func ParseOptions(str string) *Options { @@ -40,10 +40,10 @@ func ParseOptions(str string) *Options { } if w != "" { - o.Width, _ = strconv.Atoi(w) + o.Width, _ = strconv.ParseFloat(w, 64) } if h != "" { - o.Height, _ = strconv.Atoi(h) + o.Height, _ = strconv.ParseFloat(h, 64) } for _, part := range parts[1:] { diff --git a/proxy/proxy.go b/proxy/proxy.go index 3686be7..b72a404 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -91,11 +91,11 @@ func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - if p.MaxWidth > 0 && req.Options.Width > p.MaxWidth { - req.Options.Width = p.MaxWidth + if p.MaxWidth > 0 && int(req.Options.Width) > p.MaxWidth { + req.Options.Width = float64(p.MaxWidth) } - if p.MaxHeight > 0 && req.Options.Height > p.MaxHeight { - req.Options.Height = p.MaxHeight + if p.MaxHeight > 0 && int(req.Options.Height) > p.MaxHeight { + req.Options.Height = float64(p.MaxHeight) } u := req.URL.String() diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go index d23f872..85d7f83 100644 --- a/proxy/proxy_test.go +++ b/proxy/proxy_test.go @@ -88,6 +88,10 @@ func TestNewRequest(t *testing.T) { "http://localhost/1x2,fit/http://example.com/", "http://example.com/", &data.Options{1, 2, true}, false, }, + { + "http://localhost/0.1x0.2,fit/http://example.com/", + "http://example.com/", &data.Options{0.1, 0.2, true}, false, + }, } for i, tt := range tests { diff --git a/transform/transform.go b/transform/transform.go index ef0e891..6a24c6a 100644 --- a/transform/transform.go +++ b/transform/transform.go @@ -35,14 +35,26 @@ func Transform(img data.Image, opt *data.Options) (*data.Image, error) { return nil, err } + var h, w int + if opt.Width > 0 && opt.Width < 1 { + w = int(float64(m.Bounds().Max.X-m.Bounds().Min.X) * opt.Width) + } else { + w = int(opt.Width) + } + if opt.Height > 0 && opt.Height < 1 { + h = int(float64(m.Bounds().Max.Y-m.Bounds().Min.Y) * opt.Height) + } else { + h = int(opt.Height) + } + // resize if opt.Fit { - m = imaging.Fit(m, opt.Width, opt.Height, imaging.Lanczos) + m = imaging.Fit(m, w, h, imaging.Lanczos) } else { if opt.Width == 0 || opt.Height == 0 { - m = imaging.Resize(m, opt.Width, opt.Height, imaging.Lanczos) + m = imaging.Resize(m, w, h, imaging.Lanczos) } else { - m = imaging.Thumbnail(m, opt.Width, opt.Height, imaging.Lanczos) + m = imaging.Thumbnail(m, w, h, imaging.Lanczos) } }