Categorygithub.com/disintegration/gift
modulepackage
1.2.1
Repository: https://github.com/disintegration/gift.git
Documentation: pkg.go.dev

# README

GO IMAGE FILTERING TOOLKIT (GIFT)

GoDoc Build Status Coverage Status Go Report Card

Package gift provides a set of useful image processing filters.

Pure Go. No external dependencies outside of the Go standard library.

INSTALLATION / UPDATING

go get -u github.com/disintegration/gift

DOCUMENTATION

http://godoc.org/github.com/disintegration/gift

QUICK START

// 1. Create a new filter list and add some filters.
g := gift.New(
	gift.Resize(800, 0, gift.LanczosResampling),
	gift.UnsharpMask(1, 1, 0),
)

// 2. Create a new image of the corresponding size.
// dst is a new target image, src is the original image.
dst := image.NewRGBA(g.Bounds(src.Bounds()))

// 3. Use the Draw func to apply the filters to src and store the result in dst.
g.Draw(dst, src)

USAGE

To create a sequence of filters, the New function is used:

g := gift.New(
	gift.Grayscale(),
	gift.Contrast(10),
)

Filters also can be added using the Add method:

g.Add(GaussianBlur(2))

The Bounds method takes the bounds of the source image and returns appropriate bounds for the destination image to fit the result (for example, after using Resize or Rotate filters).

dst := image.NewRGBA(g.Bounds(src.Bounds()))

There are two methods available to apply these filters to an image:

  • Draw applies all the added filters to the src image and outputs the result to the dst image starting from the top-left corner (Min point).
g.Draw(dst, src)
  • DrawAt provides more control. It outputs the filtered src image to the dst image at the specified position using the specified image composition operator. This example is equivalent to the previous:
g.DrawAt(dst, src, dst.Bounds().Min, gift.CopyOperator)

Two image composition operators are supported by now:

  • CopyOperator - Replaces pixels of the dst image with pixels of the filtered src image. This mode is used by the Draw method.
  • OverOperator - Places the filtered src image on top of the dst image. This mode makes sence if the filtered src image has transparent areas.

Empty filter list can be used to create a copy of an image or to paste one image to another. For example:

// Create a new image with dimensions of the bgImage.
dstImage := image.NewRGBA(bgImage.Bounds())
// Copy the bgImage to the dstImage.
gift.New().Draw(dstImage, bgImage)
// Draw the fgImage over the dstImage at the (100, 100) position.
gift.New().DrawAt(dstImage, fgImage, image.Pt(100, 100), gift.OverOperator)

SUPPORTED FILTERS

  • Transformations

    • Crop(rect image.Rectangle)
    • CropToSize(width, height int, anchor Anchor)
    • FlipHorizontal()
    • FlipVertical()
    • Resize(width, height int, resampling Resampling)
    • ResizeToFill(width, height int, resampling Resampling, anchor Anchor)
    • ResizeToFit(width, height int, resampling Resampling)
    • Rotate(angle float32, backgroundColor color.Color, interpolation Interpolation)
    • Rotate180()
    • Rotate270()
    • Rotate90()
    • Transpose()
    • Transverse()
  • Adjustments & effects

    • Brightness(percentage float32)
    • ColorBalance(percentageRed, percentageGreen, percentageBlue float32)
    • ColorFunc(fn func(r0, g0, b0, a0 float32) (r, g, b, a float32))
    • Colorize(hue, saturation, percentage float32)
    • ColorspaceLinearToSRGB()
    • ColorspaceSRGBToLinear()
    • Contrast(percentage float32)
    • Convolution(kernel []float32, normalize, alpha, abs bool, delta float32)
    • Gamma(gamma float32)
    • GaussianBlur(sigma float32)
    • Grayscale()
    • Hue(shift float32)
    • Invert()
    • Maximum(ksize int, disk bool)
    • Mean(ksize int, disk bool)
    • Median(ksize int, disk bool)
    • Minimum(ksize int, disk bool)
    • Pixelate(size int)
    • Saturation(percentage float32)
    • Sepia(percentage float32)
    • Sigmoid(midpoint, factor float32)
    • Sobel()
    • Threshold(percentage float32)
    • UnsharpMask(sigma, amount, threshold float32)

FILTER EXAMPLES

The original image:

Resulting images after applying some of the filters:

name / resultname / resultname / resultname / result
resizecrop_to_sizerotate_180rotate_30
brightness_increasebrightness_decreasecontrast_increasecontrast_decrease
saturation_increasesaturation_decreasegamma_1.5gamma_0.5
gaussian_blurunsharp_masksigmoidpixelate
colorizegrayscalesepiainvert
meanmedianminimummaximum
hue_rotatecolor_balancecolor_funcconvolution_emboss

Here's the code that produces the above images:

package main

import (
	"image"
	"image/color"
	"image/png"
	"log"
	"os"

	"github.com/disintegration/gift"
)

func main() {
	src := loadImage("testdata/src.png")

	filters := map[string]gift.Filter{
		"resize":               gift.Resize(100, 0, gift.LanczosResampling),
		"crop_to_size":         gift.CropToSize(100, 100, gift.LeftAnchor),
		"rotate_180":           gift.Rotate180(),
		"rotate_30":            gift.Rotate(30, color.Transparent, gift.CubicInterpolation),
		"brightness_increase":  gift.Brightness(30),
		"brightness_decrease":  gift.Brightness(-30),
		"contrast_increase":    gift.Contrast(30),
		"contrast_decrease":    gift.Contrast(-30),
		"saturation_increase":  gift.Saturation(50),
		"saturation_decrease":  gift.Saturation(-50),
		"gamma_1.5":            gift.Gamma(1.5),
		"gamma_0.5":            gift.Gamma(0.5),
		"gaussian_blur":        gift.GaussianBlur(1),
		"unsharp_mask":         gift.UnsharpMask(1, 1, 0),
		"sigmoid":              gift.Sigmoid(0.5, 7),
		"pixelate":             gift.Pixelate(5),
		"colorize":             gift.Colorize(240, 50, 100),
		"grayscale":            gift.Grayscale(),
		"sepia":                gift.Sepia(100),
		"invert":               gift.Invert(),
		"mean":                 gift.Mean(5, true),
		"median":               gift.Median(5, true),
		"minimum":              gift.Minimum(5, true),
		"maximum":              gift.Maximum(5, true),
		"hue_rotate":           gift.Hue(45),
		"color_balance":        gift.ColorBalance(10, -10, -10),
		"color_func": gift.ColorFunc(
			func(r0, g0, b0, a0 float32) (r, g, b, a float32) {
				r = 1 - r0   // invert the red channel
				g = g0 + 0.1 // shift the green channel by 0.1
				b = 0        // set the blue channel to 0
				a = a0       // preserve the alpha channel
				return r, g, b, a
			},
		),
		"convolution_emboss": gift.Convolution(
			[]float32{
				-1, -1, 0,
				-1, 1, 1,
				0, 1, 1,
			},
			false, false, false, 0.0,
		),
	}

	for name, filter := range filters {
		g := gift.New(filter)
		dst := image.NewNRGBA(g.Bounds(src.Bounds()))
		g.Draw(dst, src)
		saveImage("testdata/dst_"+name+".png", dst)
	}
}

func loadImage(filename string) image.Image {
	f, err := os.Open(filename)
	if err != nil {
		log.Fatalf("os.Open failed: %v", err)
	}
	defer f.Close()
	img, _, err := image.Decode(f)
	if err != nil {
		log.Fatalf("image.Decode failed: %v", err)
	}
	return img
}

func saveImage(filename string, img image.Image) {
	f, err := os.Create(filename)
	if err != nil {
		log.Fatalf("os.Create failed: %v", err)
	}
	defer f.Close()
	err = png.Encode(f, img)
	if err != nil {
		log.Fatalf("png.Encode failed: %v", err)
	}
}

# Functions

Brightness creates a filter that changes the brightness of an image.
ColorBalance creates a filter that changes the color balance of an image.
ColorFunc creates a filter that changes the colors of an image using custom function.
Colorize creates a filter that produces a colorized version of an image.
ColorspaceLinearToSRGB creates a filter that converts the colors of an image from linear RGB to sRGB.
ColorspaceSRGBToLinear creates a filter that converts the colors of an image from sRGB to linear RGB.
Contrast creates a filter that changes the contrast of an image.
Convolution creates a filter that applies a square convolution kernel to an image.
Crop creates a filter that crops the specified rectangular region from an image.
CropToSize creates a filter that crops an image to the specified size using the specified anchor point.
FlipHorizontal creates a filter that flips an image horizontally.
FlipVertical creates a filter that flips an image vertically.
Gamma creates a filter that performs a gamma correction on an image.
GaussianBlur creates a filter that applies a gaussian blur to an image.
Grayscale creates a filter that produces a grayscale version of an image.
Hue creates a filter that rotates the hue of an image.
Invert creates a filter that negates the colors of an image.
Maximum creates a local maximum image filter.
Mean creates a local mean image filter.
Median creates a median image filter.
Minimum creates a local minimum image filter.
New creates a new filter list and initializes it with the given slice of filters.
Pixelate creates a filter that applies a pixelation effect to an image.
Resize creates a filter that resizes an image to the specified width and height using the specified resampling.
ResizeToFill creates a filter that resizes an image to the smallest possible size that will cover the specified dimensions, then crops the resized image to the specified dimensions using the specified anchor point.
ResizeToFit creates a filter that resizes an image to fit within the specified dimensions while preserving the aspect ratio.
Rotate creates a filter that rotates an image by the given angle counter-clockwise.
Rotate180 creates a filter that rotates an image 180 degrees counter-clockwise.
Rotate270 creates a filter that rotates an image 270 degrees counter-clockwise.
Rotate90 creates a filter that rotates an image 90 degrees counter-clockwise.
Saturation creates a filter that changes the saturation of an image.
Sepia creates a filter that produces a sepia-toned version of an image.
Sigmoid creates a filter that changes the contrast of an image using a sigmoidal function and returns the adjusted image.
Sobel creates a filter that applies a sobel operator to an image.
Threshold creates a filter that applies black/white thresholding to the image.
Transpose creates a filter that flips an image horizontally and rotates 90 degrees counter-clockwise.
Transverse creates a filter that flips an image vertically and rotates 90 degrees counter-clockwise.
UnsharpMask creates a filter that sharpens an image.

# Constants

Anchor point positions.
Anchor point positions.
Anchor point positions.
Anchor point positions.
Composition operators.
CubicInterpolation is a bicubic interpolation algorithm.
Anchor point positions.
LinearInterpolation is a bilinear interpolation algorithm.
NearestNeighborInterpolation is a nearest-neighbor interpolation algorithm.
Composition operators.
Anchor point positions.
Anchor point positions.
Anchor point positions.
Anchor point positions.

# Variables

BoxResampling is a box resampling filter (average of surrounding pixels).
CubicResampling is a bicubic resampling filter (Catmull-Rom).
LanczosResampling is a Lanczos resampling filter (3 lobes).
LinearResampling is a bilinear resampling filter.
NearestNeighborResampling is a nearest neighbor resampling filter.

# Structs

GIFT is a list of image processing filters.
Options is the parameters passed to image processing filters.

# Interfaces

Filter is an image processing filter.
Resampling is an interpolation algorithm used for image resizing.

# Type aliases

Anchor is the anchor point for image cropping.
Interpolation is an interpolation algorithm used for image transformation.
Operator is an image composition operator.