封装成像提供基本的图像处理功能(调整大小、旋转、裁剪、亮度/对比度调整等)。

包提供的所有图像处理函数都接受任何实现接口的图像类型 作为输入,并返回类型的新图像(32 位 RGBA 颜色,非预乘 alpha).image.Image*image.NRGBA

Grigory Dryapak d40f48ce0f Merge pull request #130 from StruffelProductions/add-hue-adjustment 4 jaren geleden
testdata 3956733f99 Remove shift limitation 4 jaren geleden
.travis.yml ab97377a03 Travis-ci: added support for ppc64le & updated go 1.13 & 1.14 & 1.15 4 jaren geleden
LICENSE 20f8a0b29d revert copyright date to 2012 6 jaren geleden
README.md d40f48ce0f Merge pull request #130 from StruffelProductions/add-hue-adjustment 4 jaren geleden
adjust.go a6f4d6450c Add detection for all trivial cases 4 jaren geleden
adjust_test.go 3956733f99 Remove shift limitation 4 jaren geleden
convolution.go 791d8b4e28 performance improvements 6 jaren geleden
convolution_test.go 416a21a28a image processing refactoring 7 jaren geleden
doc.go 5362c131d5 tidy up docs and comments 6 jaren geleden
effects.go 5362c131d5 tidy up docs and comments 6 jaren geleden
effects_test.go 3315d80b86 fix golden tests on arm64, ppc64le, s390x 6 jaren geleden
example_test.go 416a21a28a image processing refactoring 7 jaren geleden
go.mod 675e3c209f upgrade x/image dependency to support v4 and v5 bmp info headers 5 jaren geleden
go.sum 675e3c209f upgrade x/image dependency to support v4 and v5 bmp info headers 5 jaren geleden
histogram.go 791d8b4e28 performance improvements 6 jaren geleden
histogram_test.go 416a21a28a image processing refactoring 7 jaren geleden
io.go 589168b0e0 io: minor refactoring of Encode and formats 6 jaren geleden
io_test.go 589168b0e0 io: minor refactoring of Encode and formats 6 jaren geleden
resize.go 24d954dc01 rewrite if/else 5 jaren geleden
resize_test.go 3315d80b86 fix golden tests on arm64, ppc64le, s390x 6 jaren geleden
scanner.go f14fb45228 feat: improve performance small case 7 jaren geleden
scanner_test.go 416a21a28a image processing refactoring 7 jaren geleden
tools.go 24d954dc01 rewrite if/else 5 jaren geleden
tools_test.go a44fc157f4 fix test case 5 jaren geleden
transform.go 791d8b4e28 performance improvements 6 jaren geleden
transform_test.go 416a21a28a image processing refactoring 7 jaren geleden
utils.go 5232859032 Support limiting the number of concurrent processing subroutines 5 jaren geleden
utils_test.go 5232859032 Support limiting the number of concurrent processing subroutines 5 jaren geleden

README.md

Imaging

PkgGoDev Build Status Coverage Status Go Report Card

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).

Installation

go get -u github.com/disintegration/imaging

Documentation

https://pkg.go.dev/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

// 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:

srcImage

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 dstImage
imaging.Linear dstImage
imaging.CatmullRom dstImage
imaging.Lanczos dstImage

Gaussian Blur

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
srcImage dstImage dstImage

Sharpening

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
srcImage dstImage dstImage

Gamma correction

dstImage := imaging.AdjustGamma(srcImage, 0.75)
Original image Gamma = 0.75 Gamma = 1.25
srcImage dstImage dstImage

Contrast adjustment

dstImage := imaging.AdjustContrast(srcImage, 20)
Original image Contrast = 15 Contrast = -15
srcImage dstImage dstImage

Brightness adjustment

dstImage := imaging.AdjustBrightness(srcImage, 20)
Original image Brightness = 10 Brightness = -10
srcImage dstImage dstImage

Saturation adjustment

dstImage := imaging.AdjustSaturation(srcImage, 20)
Original image Saturation = 30 Saturation = -30
srcImage dstImage dstImage

Hue adjustment

dstImage := imaging.AdjustHue(srcImage, 20)
Original image Hue = 60 Hue = -60
srcImage dstImage dstImage

FAQ

Incorrect image orientation after processing (e.g. an image appears rotated after resizing)

Most probably, the given image contains the EXIF orientation tag. The standard 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))

What's the difference between 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.

Example code

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:

dstImage