imaging

Imaging is a simple image processing package for Go

Github星跟踪图

Imaging

GoDoc
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

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

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

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

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

主要指标

概览
名称与所有者disintegration/imaging
主编程语言Go
编程语言Go (语言数: 1)
平台
许可证MIT License
所有者活动
创建于2012-12-06 20:21:21
推送于2023-09-21 02:16:10
最后一次提交2020-12-18 22:30:11
发布数15
最新版本名称v1.6.2 (发布于 )
第一版名称v1.0.0 (发布于 )
用户参与
星数5.5k
关注者数80
派生数460
提交数202
已启用问题?
问题数133
打开的问题数30
拉请求数17
打开的拉请求数3
关闭的拉请求数20
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?