commit | 0d8eac95841633283b5e1d8d4b4920b55d46f558 | [log] [tgz] |
---|---|---|
author | StruffelProductions <31403260+StruffelProductions@users.noreply.github.com> | Sun Nov 22 11:33:32 2020 |
committer | StruffelProductions <31403260+StruffelProductions@users.noreply.github.com> | Sun Nov 22 11:33:32 2020 |
tree | f0327a63f679fc511fa216f38fff7cfaa862a549 | |
parent | 84be08e61274361ee54f73dc1f36d4ce463ec49f [diff] |
Invert hue adjustment direction Inverts the direction in which the hue is rotated to bring the function in line with the HSL filters in GIMP, Krita and Blender.
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, non-premultiplied alpha).
go get -u github.com/disintegration/imaging
http://godoc.org/github.com/disintegration/imaging
A few usage examples can be found below. See the documentation for the full list of supported functions.
// 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:
Lanczos
- A high-quality resampling filter for photographic images yielding sharp results.CatmullRom
- A sharp cubic filter that is faster than Lanczos filter while providing similar results.MitchellNetravali
- A cubic filter that produces smoother results with less ringing artifacts than CatmullRom.Linear
- Bilinear resampling filter, produces smooth output. Faster than cubic filters.Box
- Simple and fast averaging filter appropriate for downscaling. When upscaling it's similar to NearestNeighbor.NearestNeighbor
- Fastest resampling filter, no antialiasing.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 |
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 |
---|---|---|
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 |
---|---|---|
dstImage := imaging.AdjustGamma(srcImage, 0.75)
Original image | Gamma = 0.75 | Gamma = 1.25 |
---|---|---|
dstImage := imaging.AdjustContrast(srcImage, 20)
Original image | Contrast = 15 | Contrast = -15 |
---|---|---|
dstImage := imaging.AdjustBrightness(srcImage, 20)
Original image | Brightness = 10 | Brightness = -10 |
---|---|---|
dstImage := imaging.AdjustSaturation(srcImage, 20)
Original image | Saturation = 30 | Saturation = -30 |
---|---|---|
dstImage := imaging.AdjustHue(srcImage, 20)
Original image | Hue = 60 | Hue = -60 |
---|---|---|
Most probably, the given image contains the EXIF orientation tag. The stadard image/*
packages do not support loading and saving this kind of information. To fix the issue, try opening images with the AutoOrientation
decode option. If this option is set to true
, the image orientation is changed after decoding, according to the orientation tag (if present). Here's the example:
img, err := imaging.Open("test.jpg", imaging.AutoOrientation(true))
imaging
and gift
packages?imaging is designed to be a lightweight and simple image manipulation package. It provides basic image processing functions and a few helper functions such as Open
and Save
. It consistently returns *image.NRGBA image type (8 bits per channel, RGBA).
gift supports more advanced image processing, for example, sRGB/Linear color space conversions. It also supports different output image types (e.g. 16 bits per channel) and provides easy-to-use API for chaining multiple processing steps together.
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: