Go 语言图像处理入门
Go (Golang) 是一种现代编译型语言,拥有丰富的标准库,其中包含用于基本位图图像处理的 image 包。然而,对于缩放、滤镜、格式转换和批量处理等任务,通常需要第三方库。在本文中,我们将介绍 Go 中最流行的图像处理工具,提供代码示例并比较它们的功能。
标准 image 包
Go 标准库中的 image 包提供了用于解码、编码和操作图像的基本类型和函数。它支持 PNG、JPEG 和 GIF(仅解码)格式。从文件加载图像的示例:
package main
import ( "image" "image/jpeg" "os")
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) }
// 通过 img.At(x, y) 访问像素 _ = img}标准包的限制:缺少内置的调整大小、旋转、滤镜和 EXIF 数据处理功能。对于这些任务,请使用第三方库。
imaging 库
imaging 是 Go 中最流行的图像处理库之一。它提供了用于调整大小、裁剪、旋转、应用滤镜和格式转换的简单 API。
安装:
go get github.com/disintegration/imaging保持比例调整大小的示例:
package main
import ( "github.com/disintegration/imaging" "log")
func main() { src, err := imaging.Open("input.jpg") if err != nil { log.Fatalf("打开错误: %v", err) }
// 将宽度调整为 800px,高度自动调整 dst := imaging.Resize(src, 800, 0, imaging.Lanczos)
err = imaging.Save(dst, "output.jpg") if err != nil { log.Fatalf("保存错误: %v", err) }}该库支持滤镜:模糊、锐化、对比度、亮度、灰度。应用滤镜的示例:
grayscaleImg := imaging.Grayscale(src)sharpImg := imaging.Sharpen(src, 0.5)blurImg := imaging.Blur(src, 3.0)优点: 简洁的 API,支持 GIF(只读),根据 EXIF 自动旋转,内置缩略图和批量处理功能。
nfnt/resize 库
nfnt/resize 是一个专门用于调整图像大小的库。它提供了多种插值算法(NearestNeighbor、Bilinear、Bicubic、MitchellNetravali、Lanczos2、Lanczos3)。
安装:
go get github.com/nfnt/resize精确调整为 200x200 像素的示例:
package main
import ( "image/jpeg" "os" "github.com/nfnt/resize")
func main() { file, _ := os.Open("input.jpg") defer file.Close() img, _ := jpeg.Decode(file)
// 调整大小为 200x200 newImg := resize.Resize(200, 200, img, resize.Lanczos3)
out, _ := os.Create("resized.jpg") defer out.Close() jpeg.Encode(out, newImg, nil)}特点: 该库仅适用于实现了 image.Image 接口的图像。不直接支持文件读写——需要手动解码/编码