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"
|
|
|
|
```
|
|
|
|
|
2012-08-09 19:04:04 +02:00
|
|
|
Resize creates a scaled image with new dimensions (`width`, `height`) using the interpolation function `interp`.
|
2012-08-09 18:56:42 +02:00
|
|
|
If either `width` or `height` is set to 0, it will be set to an aspect ratio preserving value.
|
2012-08-03 17:41:21 +02:00
|
|
|
|
|
|
|
```go
|
2012-08-09 19:04:04 +02:00
|
|
|
resize.Resize(width, height 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
|
|
|
|
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.
|