golang简单高效的图像处理插件库imaging的使用

Golang简单高效的图像处理插件库imaging的使用

Imaging是一个Golang图像处理库,提供了基本的图像处理功能(调整大小、旋转、裁剪、亮度/对比度调整等)。

安装

go get -u github.com/disintegration/imaging

基本功能示例

图像缩放

// 使用Lanczos滤波器将srcImage调整为128x128px大小
dstImage128 := imaging.Resize(srcImage, 128, 128, imaging.Lanczos)

// 将srcImage调整为宽度=800px,保持宽高比
dstImage800 := imaging.Resize(srcImage, 800, 0, imaging.Lanczos)

// 将srcImage缩小以适应800x600px的边界框
dstImageFit := imaging.Fit(srcImage, 800, 600, imaging.Lanczos)

// 调整大小并裁剪srcImage以填充100x100px区域
dstImageFill := imaging.Fill(srcImage, 100, 100, imaging.Center, imaging.Lanczos)

Imaging支持使用各种重采样滤波器进行图像缩放,最常用的有:

  • Lanczos - 高质量的重采样滤波器,适合照片图像,能产生清晰的结果
  • CatmullRom - 锐利的立方滤波器,比Lanczos滤波器更快,同时提供类似的结果
  • MitchellNetravali - 立方滤波器,产生比CatmullRom更平滑的结果,振铃伪影更少
  • Linear - 双线性重采样滤波器,产生平滑的输出
  • Box - 简单快速的均值滤波器,适合缩小图像
  • NearestNeighbor - 最快的重采样滤波器,无抗锯齿

高斯模糊

dstImage := imaging.Blur(srcImage, 0.5)

Sigma参数可以控制模糊效果的强度。

锐化

dstImage := imaging.Sharpen(srcImage, 0.5)

Sharpen内部使用高斯函数。Sigma参数可以控制锐化效果的强度。

伽马校正

dstImage := imaging.AdjustGamma(srcImage, 0.75)

对比度调整

dstImage := imaging.AdjustContrast(srcImage, 20)

亮度调整

dstImage := imaging.AdjustBrightness(srcImage, 20)

饱和度调整

dstImage := imaging.AdjustSaturation(srcImage, 20)

色调调整

dstImage := imaging.AdjustHue(srcImage, 20)

完整示例代码

package main

import (
	"image"
	"image/color"
	"log"

	"github.com/disintegration/imaging"
)

func main() {
	// 打开测试图像
	src, err := imaging.Open("testdata/flowers.png")
	if err != nil {
		log.Fatalf("failed to open image: %v", err)
	}

	// 使用中心锚点将原始图像裁剪为300x300px大小
	src = imaging.CropAnchor(src, 300, 300, imaging.Center)

	// 将裁剪后的图像调整为宽度=200px,保持宽高比
	src = imaging.Resize(src, 200, 0, imaging.Lanczos)

	// 创建图像的模糊版本
	img1 := imaging.Blur(src, 5)

	// 创建具有更高对比度和锐度的灰度图像
	img2 := imaging.Grayscale(src)
	img2 = imaging.AdjustContrast(img2, 20)
	img2 = imaging.Sharpen(img2, 2)

	// 创建图像的倒置版本
	img3 := imaging.Invert(src)

	// 使用卷积滤波器创建图像的浮雕版本
	img4 := imaging.Convolve3x3(
		src,
		[9]float64{
			-1, -1, 0,
			-1, 1, 1,
			0, 1, 1,
		},
		nil,
	)

	// 创建新图像并将四个处理后的图像粘贴到其中
	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))

	// 将结果图像保存为JPEG
	err = imaging.Save(dst, "testdata/out_example.jpg")
	if err != nil {
		log.Fatalf("failed to save image: %v", err)
	}
}

常见问题

处理后图像方向不正确(例如调整大小后图像看起来旋转了)

很可能给定的图像包含EXIF方向标签。标准的image/*包不支持加载和保存这类信息。要解决这个问题,可以尝试使用AutoOrientation解码选项打开图像。

img, err := imaging.Open("test.jpg", imaging.AutoOrientation(true))

imaging和gift包有什么区别?

imaging设计为一个轻量级和简单的图像处理包。它提供基本的图像处理功能和几个辅助函数,如OpenSave。它始终返回*image.NRGBA图像类型(每通道8位,RGBA)。

gift支持更高级的图像处理,例如sRGB/Linear颜色空间转换。它还支持不同的输出图像类型(例如每通道16位),并提供了易于使用的API来链接多个处理步骤。


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

1 回复

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


使用Golang的imaging库进行图像处理

imaging是一个简单高效的Go语言图像处理库,它提供了基本的图像处理功能,如调整大小、裁剪、旋转、滤镜应用等。下面我将介绍imaging库的主要功能和使用方法。

安装

首先安装imaging库:

go get github.com/disintegration/imaging

基本使用

1. 加载和保存图像

package main

import (
	"github.com/disintegration/imaging"
	"log"
)

func main() {
	// 加载图像
	src, err := imaging.Open("input.jpg")
	if err != nil {
		log.Fatalf("failed to open image: %v", err)
	}

	// 保存图像
	err = imaging.Save(src, "output.jpg")
	if err != nil {
		log.Fatalf("failed to save image: %v", err)
	}
}

2. 调整图像大小

// 调整图像大小为300x300像素
dst := imaging.Resize(src, 300, 300, imaging.Lanczos)

// 按比例调整宽度为300像素,高度自动计算
dst := imaging.Resize(src, 300, 0, imaging.Lanczos)

// 按比例调整高度为300像素,宽度自动计算
dst := imaging.Resize(src, 0, 300, imaging.Lanczos)

3. 裁剪图像

// 从中心裁剪300x300像素的区域
dst := imaging.CropCenter(src, 300, 300)

// 自定义裁剪区域 (x, y, width, height)
dst := imaging.Crop(src, image.Rect(100, 100, 400, 400))

4. 旋转和翻转图像

// 旋转90度
dst := imaging.Rotate90(src)

// 旋转180度
dst := imaging.Rotate180(src)

// 旋转270度
dst := imaging.Rotate270(src)

// 水平翻转
dst := imaging.FlipH(src)

// 垂直翻转
dst := imaging.FlipV(src)

5. 应用滤镜

// 灰度化
dst := imaging.Grayscale(src)

// 反色
dst := imaging.Invert(src)

// 高斯模糊 (radius越大越模糊)
dst := imaging.Blur(src, 2.5)

// 锐化
dst := imaging.Sharpen(src, 2.0)

// 调整亮度 (-100到100)
dst := imaging.AdjustBrightness(src, 20)

// 调整对比度 (-100到100)
dst := imaging.AdjustContrast(src, 20)

// 调整饱和度 (-100到100)
dst := imaging.AdjustSaturation(src, 20)

6. 图像合成

// 叠加两张图像
dst := imaging.Overlay(src1, src2, image.Pt(50, 50), 1.0)

// 混合两张图像 (alpha是混合比例,0.0-1.0)
dst := imaging.Blend(src1, src2, 0.5)

高级示例

创建缩略图

func createThumbnail(inputPath, outputPath string, width, height int) error {
	src, err := imaging.Open(inputPath)
	if err != nil {
		return err
	}

	// 保持宽高比调整大小
	thumb := imaging.Fill(src, width, height, imaging.Center, imaging.Lanczos)
	
	// 设置JPEG质量
	options := imaging.JPEGQuality(85)
	
	return imaging.Save(thumb, outputPath, options)
}

添加水印

func addWatermark(inputPath, outputPath, watermarkPath string) error {
	// 加载原始图像和水印
	src, err := imaging.Open(inputPath)
	if err != nil {
		return err
	}
	
	watermark, err := imaging.Open(watermarkPath)
	if err != nil {
		return err
	}
	
	// 调整水印大小
	watermark = imaging.Resize(watermark, 200, 0, imaging.Lanczos)
	
	// 计算水印位置 (右下角)
	pos := image.Pt(
		src.Bounds().Dx()-watermark.Bounds().Dx()-10,
		src.Bounds().Dy()-watermark.Bounds().Dy()-10,
	)
	
	// 叠加水印 (0.5透明度)
	dst := imaging.Overlay(src, watermark, pos, 0.5)
	
	return imaging.Save(dst, outputPath)
}

性能提示

  1. 对于大图像处理,考虑使用imaging.Bounds()获取尺寸后先进行适当裁剪或缩小
  2. imaging.Lanczos重采样质量高但速度较慢,对性能要求高时可考虑imaging.Linearimaging.NearestNeighbor
  3. 批量处理图像时,可以使用goroutine并行处理

imaging库简单易用,适合大多数常见的图像处理需求。对于更高级的图像处理功能,可能需要考虑其他专门的库如gocv(OpenCV绑定)或bild

回到顶部