0
Fork 0
mirror of https://github.com/willnorris/imageproxy.git synced 2024-12-16 21:56:43 -05:00

Add quality option

- Added 'q' option to specify quality (used for JPEGs)
- Updated tests
- Update documentation
This commit is contained in:
Pete Smith 2015-01-12 17:32:00 +00:00
parent 0980ea64a0
commit e7b0a5b88c
4 changed files with 34 additions and 8 deletions

View file

@ -66,6 +66,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 counter-clockwise. Valid degrees values are `90`, `180`, and `270`. Images
are rotated **after** being resized. are rotated **after** being resized.
#### Quality ####
The `q{percentage}` option can be used to specify the output quality (JPEG
only).
#### Flip #### #### Flip ####
The `fv` option will flip the image vertically. The `fh` option will flip the The `fv` option will flip the image vertically. The `fh` option will flip the
@ -99,6 +104,7 @@ x100 | 100px tall, proportional width | <a href="https://willnorris
150,fit | scale to fit 150px square, no cropping | <a href="https://willnorris.com/api/imageproxy/150,fit/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/150,fit/https://willnorris.com/2013/12/small-things.jpg" alt="150,fit"></a> 150,fit | scale to fit 150px square, no cropping | <a href="https://willnorris.com/api/imageproxy/150,fit/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/150,fit/https://willnorris.com/2013/12/small-things.jpg" alt="150,fit"></a>
100,r90 | 100px square, rotated 90 degrees | <a href="https://willnorris.com/api/imageproxy/100,r90/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/100,r90/https://willnorris.com/2013/12/small-things.jpg" alt="100,r90"></a> 100,r90 | 100px square, rotated 90 degrees | <a href="https://willnorris.com/api/imageproxy/100,r90/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/100,r90/https://willnorris.com/2013/12/small-things.jpg" alt="100,r90"></a>
100,fv,fh | 100px square, flipped horizontal and vertical | <a href="https://willnorris.com/api/imageproxy/100,fv,fh/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/100,fv,fh/https://willnorris.com/2013/12/small-things.jpg" alt="100,fv,fh"></a> 100,fv,fh | 100px square, flipped horizontal and vertical | <a href="https://willnorris.com/api/imageproxy/100,fv,fh/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/100,fv,fh/https://willnorris.com/2013/12/small-things.jpg" alt="100,fv,fh"></a>
200x,q60 | 200px wide, proportional height, 60% quality | <a href="https://willnorris.com/api/imageproxy/200x,q60/https://willnorris.com/2013/12/small-things.jpg"><img src="https://willnorris.com/api/imageproxy/200x,q60/https://willnorris.com/2013/12/small-things.jpg" alt="200x,q60"></a>
## Getting Started ## ## Getting Started ##

14
data.go
View file

@ -28,6 +28,7 @@ const (
optFlipVertical = "fv" optFlipVertical = "fv"
optFlipHorizontal = "fh" optFlipHorizontal = "fh"
optRotatePrefix = "r" optRotatePrefix = "r"
optQualityPrefix = "q"
optSizeDelimiter = "x" optSizeDelimiter = "x"
) )
@ -57,6 +58,9 @@ type Options struct {
FlipVertical bool FlipVertical bool
FlipHorizontal bool FlipHorizontal bool
// Quality of output image
Quality int
} }
var emptyOptions = Options{} var emptyOptions = Options{}
@ -76,6 +80,7 @@ func (o Options) String() string {
if o.FlipHorizontal { if o.FlipHorizontal {
fmt.Fprintf(buf, ",%s", optFlipHorizontal) fmt.Fprintf(buf, ",%s", optFlipHorizontal)
} }
fmt.Fprintf(buf, ",%s%d", string(optQualityPrefix), o.Quality)
return buf.String() return buf.String()
} }
@ -119,6 +124,11 @@ func (o Options) String() string {
// The "fv" option will flip the image vertically. The "fh" option will flip // The "fv" option will flip the image vertically. The "fh" option will flip
// the image horizontally. Images are flipped after being rotated. // the image horizontally. Images are flipped after being rotated.
// //
// Quality
//
// The "q{qualityPercentage}" option can be used to specify the quality of the
// output file (JPEG only)
//
// Examples // Examples
// //
// 0x0 - no resizing // 0x0 - no resizing
@ -130,6 +140,7 @@ func (o Options) String() string {
// 150,fit - scale to fit 150 pixels square, no cropping // 150,fit - scale to fit 150 pixels square, no cropping
// 100,r90 - 100 pixels square, rotated 90 degrees // 100,r90 - 100 pixels square, rotated 90 degrees
// 100,fv,fh - 100 pixels square, flipped horizontal and vertical // 100,fv,fh - 100 pixels square, flipped horizontal and vertical
// 200x,q80 - 200 pixels wide, proportional height, 80% quality
func ParseOptions(str string) Options { func ParseOptions(str string) Options {
options := Options{} options := Options{}
@ -146,6 +157,9 @@ func ParseOptions(str string) Options {
case strings.HasPrefix(opt, optRotatePrefix): case strings.HasPrefix(opt, optRotatePrefix):
value := strings.TrimPrefix(opt, optRotatePrefix) value := strings.TrimPrefix(opt, optRotatePrefix)
options.Rotate, _ = strconv.Atoi(value) options.Rotate, _ = strconv.Atoi(value)
case strings.HasPrefix(opt, optQualityPrefix):
value := strings.TrimPrefix(opt, optQualityPrefix)
options.Quality, _ = strconv.Atoi(value)
case strings.Contains(opt, optSizeDelimiter): case strings.Contains(opt, optSizeDelimiter):
size := strings.SplitN(opt, optSizeDelimiter, 2) size := strings.SplitN(opt, optSizeDelimiter, 2)
if w := size[0]; w != "" { if w := size[0]; w != "" {

View file

@ -26,15 +26,15 @@ func TestOptions_String(t *testing.T) {
}{ }{
{ {
emptyOptions, emptyOptions,
"0x0", "0x0,q0",
}, },
{ {
Options{1, 2, true, 90, true, true}, Options{1, 2, true, 90, true, true, 80},
"1x2,fit,r90,fv,fh", "1x2,fit,r90,fv,fh,q80",
}, },
{ {
Options{0.15, 1.3, false, 45, false, false}, Options{0.15, 1.3, false, 45, false, false, 95},
"0.15x1.3,r45", "0.15x1.3,r45,q95",
}, },
} }
@ -82,8 +82,8 @@ func TestParseOptions(t *testing.T) {
{"FOO,1,BAR,r90,BAZ", Options{Width: 1, Height: 1, Rotate: 90}}, {"FOO,1,BAR,r90,BAZ", Options{Width: 1, Height: 1, Rotate: 90}},
// all flags, in different orders // all flags, in different orders
{"1x2,fit,r90,fv,fh", Options{1, 2, true, 90, true, true}}, {"q70,1x2,fit,r90,fv,fh", Options{1, 2, true, 90, true, true, 70}},
{"r90,fh,1x2,fv,fit", Options{1, 2, true, 90, true, true}}, {"r90,fh,q90,1x2,fv,fit", Options{1, 2, true, 90, true, true, 90}},
} }
for _, tt := range tests { for _, tt := range tests {

View file

@ -53,7 +53,13 @@ func Transform(img []byte, opt Options) ([]byte, error) {
case "gif": case "gif":
gif.Encode(buf, m, nil) gif.Encode(buf, m, nil)
case "jpeg": case "jpeg":
jpeg.Encode(buf, m, &jpeg.Options{Quality: jpegQuality}) quality := opt.Quality
if quality == 0 {
quality = jpegQuality
}
jpeg.Encode(buf, m, &jpeg.Options{Quality: quality})
case "png": case "png":
png.Encode(buf, m) png.Encode(buf, m)
} }