golang图像处理滤镜插件库gift的使用

Golang图像处理滤镜插件库gift的使用

简介

Gift (Go Image Filtering Toolkit) 是一个提供一系列有用图像处理滤镜的Go语言包。它是纯Go实现,除了Go标准库外没有其他外部依赖。

安装/更新

go get -u github.com/disintegration/gift

快速开始

// 1. 创建一个新的滤镜列表并添加一些滤镜
g := gift.New(
    gift.Resize(800, 0, gift.LanczosResampling),
    gift.UnsharpMask(1, 1, 0),
)

// 2. 创建一个对应尺寸的新图像
// dst是目标图像,src是原始图像
dst := image.NewRGBA(g.Bounds(src.Bounds()))

// 3. 使用Draw函数将滤镜应用到src并将结果存储到dst
g.Draw(dst, src)

使用方法

要创建一系列滤镜,使用New函数:

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

也可以使用Add方法添加滤镜:

g.Add(GaussianBlur(2))

Bounds方法获取源图像的边界并返回适合目标图像的边界(例如在使用ResizeRotate滤镜后)。

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

有两种方法可以将这些滤镜应用到图像:

  1. Draw - 将所有添加的滤镜应用到src图像,并将结果输出到dst图像,从左上角(Min点)开始。
g.Draw(dst, src)
  1. DrawAt - 提供更多控制。它将过滤后的src图像输出到指定位置的dst图像,使用指定的图像合成操作符。
g.DrawAt(dst, src, dst.Bounds().Min, gift.CopyOperator)

目前支持两种图像合成操作符:

  • CopyOperator - 用过滤后的src图像的像素替换dst图像的像素。这是Draw方法使用的模式。
  • OverOperator - 将过滤后的src图像放在dst图像上方。如果过滤后的src图像有透明区域,这种模式很有意义。

空滤镜列表可用于创建图像副本或将一个图像粘贴到另一个图像上。例如:

// 创建一个与bgImage尺寸相同的新图像
dstImage := image.NewRGBA(bgImage.Bounds())
// 将bgImage复制到dstImage
gift.New().Draw(dstImage, bgImage)
// 在(100, 100)位置将fgImage绘制到dstImage上
gift.New().DrawAt(dstImage, fgImage, image.Pt(100, 100), gift.OverOperator)

支持的滤镜

变换

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

调整和效果

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

滤镜示例

以下是使用gift库处理图像的完整示例代码:

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   // 反转红色通道
                g = g0 + 0.1 // 将绿色通道偏移0.1
                b = 0        // 将蓝色通道设置为0
                a = a0       // 保留alpha通道
                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)
    }
}

这个示例展示了如何使用gift库的各种滤镜处理图像,包括调整大小、裁剪、旋转、亮度/对比度调整、模糊效果、颜色转换等。


更多关于golang图像处理滤镜插件库gift的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang图像处理滤镜插件库gift的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言图像处理滤镜插件库Gift的使用指南

Gift (Go Image Filtering Toolkit) 是一个轻量级的Go语言图像处理库,提供了多种常用的图像滤镜和特效功能。下面我将详细介绍如何使用这个库。

安装Gift

首先需要安装Gift库:

go get github.com/disintegration/gift

基本使用

1. 加载和保存图像

package main

import (
	"image"
	"image/jpeg"
	"os"
	
	"github.com/disintegration/gift"
)

func main() {
	// 打开图像文件
	file, err := os.Open("input.jpg")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 解码图像
	img, _, err := image.Decode(file)
	if err != nil {
		panic(err)
	}

	// 创建一个新的Gift实例
	g := gift.New()

	// 创建输出文件
	outFile, err := os.Create("output.jpg")
	if err != nil {
		panic(err)
	}
	defer outFile.Close()

	// 应用滤镜并保存图像
	g.Draw(outFile, img)
	jpeg.Encode(outFile, img, nil)
}

2. 常用滤镜示例

灰度化

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

模糊效果

g := gift.New(
	gift.GaussianBlur(2), // 参数是模糊半径
)

调整亮度和对比度

g := gift.New(
	gift.Brightness(0.2),   // 亮度调整(-1到1)
	gift.Contrast(0.3),     // 对比度调整(-1到1)
)

调整饱和度

g := gift.New(
	gift.Saturation(0.8),  // 饱和度调整(0-1)
)

调整色相

g := gift.New(
	gift.Hue(45),  // 色相旋转角度(0-360)
)

颜色反转

g := gift.New(
	gift.Invert(),
)

边缘检测

g := gift.New(
	gift.Sobel(),
)

像素化效果

g := gift.New(
	gift.Pixelate(10),  // 像素块大小
)

3. 组合多个滤镜

g := gift.New(
	gift.Grayscale(),
	gift.Sepia(100),       // 深褐色效果
	gift.Contrast(0.2),
	gift.Brightness(0.1),
)

4. 调整图像大小

g := gift.New(
	gift.Resize(800, 0, gift.LanczosResampling),  // 宽度800px,高度按比例缩放
)

高级用法

1. 自定义滤镜

// 自定义一个红色增强滤镜
redEnhance := gift.ColorBalance(0.3, 0, 0)

g := gift.New(
	redEnhance,
	gift.Contrast(0.2),
)

2. 处理图像的一部分

// 创建一个子图像
bounds := img.Bounds()
subImg := image.NewRGBA(image.Rect(0, 0, bounds.Dx()/2, bounds.Dy()/2))

// 只对子图像应用滤镜
g := gift.New(gift.Grayscale())
g.Draw(subImg, img)

3. 并发处理多个图像

func processImage(inputPath, outputPath string) {
	// 图像处理逻辑...
}

func main() {
	imagePaths := []string{"img1.jpg", "img2.jpg", "img3.jpg"}
	
	var wg sync.WaitGroup
	for _, path := range imagePaths {
		wg.Add(1)
		go func(p string) {
			defer wg.Done()
			processImage(p, "out_"+p)
		}(path)
	}
	wg.Wait()
}

性能优化技巧

  1. 复用Gift实例:如果多次应用相同的滤镜组合,可以复用Gift实例
  2. 批量处理:对多个图像应用相同滤镜时,使用并发处理
  3. 合理选择重采样算法:调整大小时,根据需求选择适当的算法
    • gift.NearestNeighborResampling:最快但质量最低
    • gift.LinearResampling:平衡速度和质量的折中方案
    • gift.LanczosResampling:质量最高但速度最慢

完整示例

package main

import (
	"image"
	"image/jpeg"
	"log"
	"os"
	
	"github.com/disintegration/gift"
)

func main() {
	// 打开输入文件
	srcFile, err := os.Open("input.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer srcFile.Close()

	// 解码图像
	srcImg, _, err := image.Decode(srcFile)
	if err != nil {
		log.Fatal(err)
	}

	// 创建滤镜组合
	g := gift.New(
		gift.Resize(800, 0, gift.LanczosResampling),
		gift.Grayscale(),
		gift.Sepia(100),
		gift.Contrast(0.2),
		gift.UnsharpMask(1.0, 1.0, 0.0), // 锐化
	)

	// 创建目标图像
	dstImg := image.NewRGBA(g.Bounds(srcImg.Bounds()))

	// 应用滤镜
	g.Draw(dstImg, srcImg)

	// 保存结果
	dstFile, err := os.Create("output.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer dstFile.Close()

	err = jpeg.Encode(dstFile, dstImg, &jpeg.Options{Quality: 90})
	if err != nil {
		log.Fatal(err)
	}
}

Gift库提供了简单而强大的图像处理能力,适合大多数常见的图像处理需求。对于更复杂的图像处理任务,可能需要结合其他专门的图像处理库。

回到顶部