2012-08-02 22:16:15 +02:00
Resize
2012-08-02 21:48:27 +02:00
======
2013-04-11 20:37:15 +02:00
Image resizing for the [Go programming language ](http://golang.org ) with common interpolation methods.
2012-08-02 22:16:15 +02:00
2013-04-03 20:50:30 +02:00
[![Build Status ](https://travis-ci.org/nfnt/resize.png )](https://travis-ci.org/nfnt/resize)
2012-08-03 17:41:21 +02:00
Installation
2012-08-03 20:17:28 +02:00
------------
2012-08-03 17:41:21 +02:00
```bash
$ go get github.com/nfnt/resize
```
It's that easy!
Usage
2012-08-03 20:17:28 +02:00
-----
2012-08-03 17:41:21 +02:00
Import package with
```go
import "github.com/nfnt/resize"
```
2014-01-30 20:03:15 +01:00
The resize package provides 2 functions:
* `resize.Resize` creates a scaled image with new dimensions (`width`, `height` ) using the interpolation function `interp` .
If either `width` or `height` is set to 0, it will be set to an aspect ratio preserving value.
* `resize.Thumbnail` downscales an image preserving its aspect ratio to the maximum dimensions (`maxWidth`, `maxHeight` ).
It will return the original image if original sizes are smaller than the provided dimensions.
2012-08-03 17:41:21 +02:00
```go
2014-01-30 20:03:15 +01:00
resize.Resize(width, height uint, img image.Image, interp resize.InterpolationFunction) image.Image
resize.Thumbnail(maxWidth, maxHeight uint, img image.Image, interp resize.InterpolationFunction) image.Image
2012-08-03 17:41:21 +02:00
```
2013-04-11 20:37:15 +02:00
The provided interpolation functions are (from fast to slow execution time)
2012-08-03 17:41:21 +02:00
2012-08-03 20:17:28 +02:00
- `NearestNeighbor` : [Nearest-neighbor interpolation ](http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation )
- `Bilinear` : [Bilinear interpolation ](http://en.wikipedia.org/wiki/Bilinear_interpolation )
- `Bicubic` : [Bicubic interpolation ](http://en.wikipedia.org/wiki/Bicubic_interpolation )
2012-09-21 20:02:25 +02:00
- `MitchellNetravali` : [Mitchell-Netravali interpolation ](http://dl.acm.org/citation.cfm?id=378514 )
2012-09-04 18:49:04 +02:00
- `Lanczos2` : [Lanczos resampling ](http://en.wikipedia.org/wiki/Lanczos_resampling ) with a=2
2012-08-03 20:17:28 +02:00
- `Lanczos3` : [Lanczos resampling ](http://en.wikipedia.org/wiki/Lanczos_resampling ) with a=3
2012-08-03 18:12:26 +02:00
2013-04-11 20:37:15 +02:00
Which of these methods gives the best results depends on your use case.
2012-08-03 18:12:26 +02:00
Sample usage:
```go
package main
import (
"github.com/nfnt/resize"
"image/jpeg"
2012-09-04 18:49:04 +02:00
"log"
2012-08-03 18:12:26 +02:00
"os"
)
func main() {
// open "test.jpg"
file, err := os.Open("test.jpg")
if err != nil {
2012-09-04 18:49:04 +02:00
log.Fatal(err)
2012-08-03 18:12:26 +02:00
}
// decode jpeg into image.Image
img, err := jpeg.Decode(file)
if err != nil {
2012-09-04 18:49:04 +02:00
log.Fatal(err)
2012-08-03 18:12:26 +02:00
}
file.Close()
// resize to width 1000 using Lanczos resampling
2012-08-23 19:36:02 +02:00
// and preserve aspect ratio
2012-08-09 18:56:42 +02:00
m := resize.Resize(1000, 0, img, resize.Lanczos3)
2012-08-03 18:12:26 +02:00
out, err := os.Create("test_resized.jpg")
if err != nil {
2012-09-04 18:49:04 +02:00
log.Fatal(err)
2012-08-03 18:12:26 +02:00
}
defer out.Close()
// write new image to file
jpeg.Encode(out, m, nil)
}
```
2012-08-03 17:41:21 +02:00
2014-07-19 14:00:14 +02:00
Caveats
-------
* Optimized access routines are used for `image.RGBA` , `image.RGBA64` , `image.YCbCr` , `image.Gray` , and `image.Gray16` types. All other image types are accessed in a generic way that will result in slow processing speed.
* JPEG images are stored in `image.YCbCr` . This image format stores data in a way that will decrease processing speed. A resize may be up to 2 times slower than with `image.RGBA` .
2012-11-14 22:08:45 +01:00
Downsizing Samples
-------
Downsizing is not as simple as it might look like. Images have to be filtered before they are scaled down, otherwise aliasing might occur.
Filtering is highly subjective: Applying too much will blur the whole image, too little will make aliasing become apparent.
Resize tries to provide sane defaults that should suffice in most cases.
### Artificial sample
Original image
![Rings ](http://nfnt.github.com/img/rings_lg_orig.png )
< table >
< tr >
< th > < img src = "http://nfnt.github.com/img/rings_300_NearestNeighbor.png" / > < br > Nearest-Neighbor< / th >
< th > < img src = "http://nfnt.github.com/img/rings_300_Bilinear.png" / > < br > Bilinear< / th >
< / tr >
< tr >
< th > < img src = "http://nfnt.github.com/img/rings_300_Bicubic.png" / > < br > Bicubic< / th >
< th > < img src = "http://nfnt.github.com/img/rings_300_MitchellNetravali.png" / > < br > Mitchell-Netravali< / th >
< / tr >
< tr >
< th > < img src = "http://nfnt.github.com/img/rings_300_Lanczos2.png" / > < br > Lanczos2< / th >
< th > < img src = "http://nfnt.github.com/img/rings_300_Lanczos3.png" / > < br > Lanczos3< / th >
< / tr >
< / table >
### Real-Life sample
Original image
![Original ](http://nfnt.github.com/img/IMG_3694_720.jpg )
< table >
< tr >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_NearestNeighbor.png" / > < br > Nearest-Neighbor< / th >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_Bilinear.png" / > < br > Bilinear< / th >
< / tr >
< tr >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_Bicubic.png" / > < br > Bicubic< / th >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_MitchellNetravali.png" / > < br > Mitchell-Netravali< / th >
< / tr >
< tr >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_Lanczos2.png" / > < br > Lanczos2< / th >
< th > < img src = "http://nfnt.github.com/img/IMG_3694_300_Lanczos3.png" / > < br > Lanczos3< / th >
< / tr >
< / table >
2012-08-02 22:16:15 +02:00
License
2012-08-03 20:17:28 +02:00
-------
2012-08-02 22:16:15 +02:00
Copyright (c) 2012 Jan Schlicht < janschlicht @ gmail . com >
2013-04-11 20:37:15 +02:00
Resize is released under a MIT style license.