From a039c1bbca4a741fea8ca3cfcacd1b0e8f961f8d Mon Sep 17 00:00:00 2001 From: Will Norris Date: Fri, 6 Dec 2013 22:18:44 -0800 Subject: [PATCH] add options to flip horizontally and vertically --- data/data.go | 12 ++++++++++++ proxy/proxy_test.go | 20 ++++++++++---------- readme.md | 6 ++++++ transform/transform.go | 8 ++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/data/data.go b/data/data.go index 77fedb2..fb6f08c 100644 --- a/data/data.go +++ b/data/data.go @@ -35,6 +35,9 @@ type Options struct { // Rotate image the specified degrees counter-clockwise. Valid values are 90, 180, 270. Rotate int + + FlipVertical bool + FlipHorizontal bool } func (o Options) String() string { @@ -68,6 +71,15 @@ func ParseOptions(str string) *Options { o.Fit = true continue } + if part == "fv" { + o.FlipVertical = true + continue + } + if part == "fh" { + o.FlipHorizontal = true + continue + } + if len(part) > 2 && strings.HasPrefix(part, "r=") { o.Rotate, _ = strconv.Atoi(part[2:]) continue diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go index 1115009..df46ea1 100644 --- a/proxy/proxy_test.go +++ b/proxy/proxy_test.go @@ -84,27 +84,27 @@ func TestNewRequest(t *testing.T) { }, { "http://localhost/1x/http://example.com/", - "http://example.com/", &data.Options{1, 0, false}, false, + "http://example.com/", &data.Options{1, 0, false, 0, false, false}, false, }, { "http://localhost/x1/http://example.com/", - "http://example.com/", &data.Options{0, 1, false}, false, + "http://example.com/", &data.Options{0, 1, false, 0, false, false}, false, }, { "http://localhost/1x2/http://example.com/", - "http://example.com/", &data.Options{1, 2, false}, false, + "http://example.com/", &data.Options{1, 2, false, 0, false, false}, false, + }, + { + "http://localhost/0.1x0.2/http://example.com/", + "http://example.com/", &data.Options{0.1, 0.2, false, 0, false, false}, false, }, { "http://localhost/,fit/http://example.com/", - "http://example.com/", &data.Options{0, 0, true}, false, + "http://example.com/", &data.Options{0, 0, true, 0, false, false}, false, }, { - "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, + "http://localhost/1x2,fit,r=90,fv,fh/http://example.com/", + "http://example.com/", &data.Options{1, 2, true, 90, true, true}, false, }, } diff --git a/readme.md b/readme.md index 63f3ea6..973e30a 100644 --- a/readme.md +++ b/readme.md @@ -65,6 +65,11 @@ The `r={degrees}` option will rotate the image the specified number of degrees, counter-clockwise. Valid degrees values are `90`, `180`, and `270`. Images are rotated **after** being resized. +#### Flip #### + +The `fv` option will flip the image vertically. The `fh` option will flip the +image horizontally. Images are flipped **after** being resized and rotated. + ### Remote URL ### The URL of the original image to load is specified as the remainder of the @@ -92,6 +97,7 @@ x100 | 100px tall, proportional width | ![x100](https://s.wjn.me/x1 100 | 100px square, cropping as needed | ![100](https://s.wjn.me/100/https://willnorris.com/content/uploads/2013/12/small-things.jpg) 150,fit | fit to be no more than 150 by 150 pixels | ![150,fit](https://s.wjn.me/150,fit/https://willnorris.com/content/uploads/2013/12/small-things.jpg) 100,r=90| 100px square, rotated 90 degrees | ![100,r=90](https://s.wjn.me/100,r=90/https://willnorris.com/content/uploads/2013/12/small-things.jpg) +100,fv,fh | 100px square, flipped horizontal and vertical | ![100,fv,fh](https://s.wjn.me/100,fv,fh/https://willnorris.com/content/uploads/2013/12/small-things.jpg) ## License ## diff --git a/transform/transform.go b/transform/transform.go index 9f40e4d..2782a8d 100644 --- a/transform/transform.go +++ b/transform/transform.go @@ -73,6 +73,14 @@ func Transform(img data.Image, opt *data.Options) (*data.Image, error) { } } + // flip + if opt.FlipVertical { + m = imaging.FlipV(m) + } + if opt.FlipHorizontal { + m = imaging.FlipH(m) + } + // rotate switch opt.Rotate { case 90: