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
方法获取源图像的边界并返回适合目标图像的边界(例如在使用Resize
或Rotate
滤镜后)。
dst := image.NewRGBA(g.Bounds(src.Bounds()))
有两种方法可以将这些滤镜应用到图像:
Draw
- 将所有添加的滤镜应用到src图像,并将结果输出到dst图像,从左上角(Min点)开始。
g.Draw(dst, src)
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()
}
性能优化技巧
- 复用Gift实例:如果多次应用相同的滤镜组合,可以复用Gift实例
- 批量处理:对多个图像应用相同滤镜时,使用并发处理
- 合理选择重采样算法:调整大小时,根据需求选择适当的算法
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库提供了简单而强大的图像处理能力,适合大多数常见的图像处理需求。对于更复杂的图像处理任务,可能需要结合其他专门的图像处理库。