188 lines
7.2 KiB
Markdown
188 lines
7.2 KiB
Markdown
|
# Imaging
|
|||
|
|
|||
|
[](https://godoc.org/github.com/disintegration/imaging)
|
|||
|
[](https://travis-ci.org/disintegration/imaging)
|
|||
|
[](https://coveralls.io/github/disintegration/imaging?branch=master)
|
|||
|
[](https://goreportcard.com/report/github.com/disintegration/imaging)
|
|||
|
|
|||
|
Package imaging provides basic image processing functions (resize, rotate, crop, brightness/contrast adjustments, etc.).
|
|||
|
|
|||
|
All the image processing functions provided by the package accept any image type that implements `image.Image` interface
|
|||
|
as an input, and return a new image of `*image.NRGBA` type (32bit RGBA colors, not premultiplied by alpha).
|
|||
|
|
|||
|
## Installation
|
|||
|
|
|||
|
go get -u github.com/disintegration/imaging
|
|||
|
|
|||
|
## Documentation
|
|||
|
|
|||
|
http://godoc.org/github.com/disintegration/imaging
|
|||
|
|
|||
|
## Usage examples
|
|||
|
|
|||
|
A few usage examples can be found below. See the documentation for the full list of supported functions.
|
|||
|
|
|||
|
### Image resizing
|
|||
|
|
|||
|
```go
|
|||
|
// Resize srcImage to size = 128x128px using the Lanczos filter.
|
|||
|
dstImage128 := imaging.Resize(srcImage, 128, 128, imaging.Lanczos)
|
|||
|
|
|||
|
// Resize srcImage to width = 800px preserving the aspect ratio.
|
|||
|
dstImage800 := imaging.Resize(srcImage, 800, 0, imaging.Lanczos)
|
|||
|
|
|||
|
// Scale down srcImage to fit the 800x600px bounding box.
|
|||
|
dstImageFit := imaging.Fit(srcImage, 800, 600, imaging.Lanczos)
|
|||
|
|
|||
|
// Resize and crop the srcImage to fill the 100x100px area.
|
|||
|
dstImageFill := imaging.Fill(srcImage, 100, 100, imaging.Center, imaging.Lanczos)
|
|||
|
```
|
|||
|
|
|||
|
Imaging supports image resizing using various resampling filters. The most notable ones:
|
|||
|
- `NearestNeighbor` - Fastest resampling filter, no antialiasing.
|
|||
|
- `Box` - Simple and fast averaging filter appropriate for downscaling. When upscaling it's similar to NearestNeighbor.
|
|||
|
- `Linear` - Bilinear filter, smooth and reasonably fast.
|
|||
|
- `MitchellNetravali` - А smooth bicubic filter.
|
|||
|
- `CatmullRom` - A sharp bicubic filter.
|
|||
|
- `Gaussian` - Blurring filter that uses gaussian function, useful for noise removal.
|
|||
|
- `Lanczos` - High-quality resampling filter for photographic images yielding sharp results, slower than cubic filters.
|
|||
|
|
|||
|
The full list of supported filters: NearestNeighbor, Box, Linear, Hermite, MitchellNetravali, CatmullRom, BSpline, Gaussian, Lanczos, Hann, Hamming, Blackman, Bartlett, Welch, Cosine. Custom filters can be created using ResampleFilter struct.
|
|||
|
|
|||
|
**Resampling filters comparison**
|
|||
|
|
|||
|
Original image:
|
|||
|
|
|||
|

|
|||
|
|
|||
|
The same image resized from 600x400px to 150x100px using different resampling filters.
|
|||
|
From faster (lower quality) to slower (higher quality):
|
|||
|
|
|||
|
Filter | Resize result
|
|||
|
--------------------------|---------------------------------------------
|
|||
|
`imaging.NearestNeighbor` | 
|
|||
|
`imaging.Linear` | 
|
|||
|
`imaging.CatmullRom` | 
|
|||
|
`imaging.Lanczos` | 
|
|||
|
|
|||
|
|
|||
|
### Gaussian Blur
|
|||
|
|
|||
|
```go
|
|||
|
dstImage := imaging.Blur(srcImage, 0.5)
|
|||
|
```
|
|||
|
|
|||
|
Sigma parameter allows to control the strength of the blurring effect.
|
|||
|
|
|||
|
Original image | Sigma = 0.5 | Sigma = 1.5
|
|||
|
-----------------------------------|----------------------------------------|---------------------------------------
|
|||
|
 |  | 
|
|||
|
|
|||
|
### Sharpening
|
|||
|
|
|||
|
```go
|
|||
|
dstImage := imaging.Sharpen(srcImage, 0.5)
|
|||
|
```
|
|||
|
|
|||
|
`Sharpen` uses gaussian function internally. Sigma parameter allows to control the strength of the sharpening effect.
|
|||
|
|
|||
|
Original image | Sigma = 0.5 | Sigma = 1.5
|
|||
|
-----------------------------------|-------------------------------------------|------------------------------------------
|
|||
|
 |  | 
|
|||
|
|
|||
|
### Gamma correction
|
|||
|
|
|||
|
```go
|
|||
|
dstImage := imaging.AdjustGamma(srcImage, 0.75)
|
|||
|
```
|
|||
|
|
|||
|
Original image | Gamma = 0.75 | Gamma = 1.25
|
|||
|
-----------------------------------|------------------------------------------|-----------------------------------------
|
|||
|
 |  | 
|
|||
|
|
|||
|
### Contrast adjustment
|
|||
|
|
|||
|
```go
|
|||
|
dstImage := imaging.AdjustContrast(srcImage, 20)
|
|||
|
```
|
|||
|
|
|||
|
Original image | Contrast = 15 | Contrast = -15
|
|||
|
-----------------------------------|--------------------------------------------|-------------------------------------------
|
|||
|
 |  | 
|
|||
|
|
|||
|
### Brightness adjustment
|
|||
|
|
|||
|
```go
|
|||
|
dstImage := imaging.AdjustBrightness(srcImage, 20)
|
|||
|
```
|
|||
|
|
|||
|
Original image | Brightness = 10 | Brightness = -10
|
|||
|
-----------------------------------|----------------------------------------------|---------------------------------------------
|
|||
|
 |  | 
|
|||
|
|
|||
|
## Example code
|
|||
|
|
|||
|
```go
|
|||
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"image"
|
|||
|
"image/color"
|
|||
|
"log"
|
|||
|
|
|||
|
"github.com/disintegration/imaging"
|
|||
|
)
|
|||
|
|
|||
|
func main() {
|
|||
|
// Open a test image.
|
|||
|
src, err := imaging.Open("testdata/flowers.png")
|
|||
|
if err != nil {
|
|||
|
log.Fatalf("failed to open image: %v", err)
|
|||
|
}
|
|||
|
|
|||
|
// Crop the original image to 300x300px size using the center anchor.
|
|||
|
src = imaging.CropAnchor(src, 300, 300, imaging.Center)
|
|||
|
|
|||
|
// Resize the cropped image to width = 200px preserving the aspect ratio.
|
|||
|
src = imaging.Resize(src, 200, 0, imaging.Lanczos)
|
|||
|
|
|||
|
// Create a blurred version of the image.
|
|||
|
img1 := imaging.Blur(src, 5)
|
|||
|
|
|||
|
// Create a grayscale version of the image with higher contrast and sharpness.
|
|||
|
img2 := imaging.Grayscale(src)
|
|||
|
img2 = imaging.AdjustContrast(img2, 20)
|
|||
|
img2 = imaging.Sharpen(img2, 2)
|
|||
|
|
|||
|
// Create an inverted version of the image.
|
|||
|
img3 := imaging.Invert(src)
|
|||
|
|
|||
|
// Create an embossed version of the image using a convolution filter.
|
|||
|
img4 := imaging.Convolve3x3(
|
|||
|
src,
|
|||
|
[9]float64{
|
|||
|
-1, -1, 0,
|
|||
|
-1, 1, 1,
|
|||
|
0, 1, 1,
|
|||
|
},
|
|||
|
nil,
|
|||
|
)
|
|||
|
|
|||
|
// Create a new image and paste the four produced images into it.
|
|||
|
dst := imaging.New(400, 400, color.NRGBA{0, 0, 0, 0})
|
|||
|
dst = imaging.Paste(dst, img1, image.Pt(0, 0))
|
|||
|
dst = imaging.Paste(dst, img2, image.Pt(0, 200))
|
|||
|
dst = imaging.Paste(dst, img3, image.Pt(200, 0))
|
|||
|
dst = imaging.Paste(dst, img4, image.Pt(200, 200))
|
|||
|
|
|||
|
// Save the resulting image as JPEG.
|
|||
|
err = imaging.Save(dst, "testdata/out_example.jpg")
|
|||
|
if err != nil {
|
|||
|
log.Fatalf("failed to save image: %v", err)
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Output:
|
|||
|
|
|||
|

|