Golang中的image包提供了基本的图像类型、颜色模型、以及用于处理图像的各种函数和接口。
常用类型与接口
image.Image
接口
这是Go语言中处理图像的核心接口,定义了所有图像必须实现的方法:
type Image interface {// Bounds returns the domain for which At can return non-zero color.// The bounds do not necessarily contain the point (0, 0).Bounds() Rectangle// At returns the color of the pixel at (x, y).// At must panic if x or y are outside the bounds of the image.At(x, y int) color.Color
}
color.Color
接口
表示一种颜色,需要实现以下方法:
type Color interface {// RGBA returns the alpha-premultiplied red, green, blue and alpha values// for the color. Each value ranges within [0, 0xffff], but is represented// by a uint32 so that multiplying by a blend factor up to 0xffff will not// overflow.RGBA() (r, g, b, a uint32)
}
color.RGBA
结构体
实现了color.Color
接口,代表一个由红绿蓝透明度组成的颜色:
type RGBA struct {R, G, B, A uint8
}
image.Decode
从输入流(如文件或网络连接)解码图像,并返回一个实现了image.Image接口的对象:
func Decode(r io.Reader) (img image.Image, err error)
file, err := os.Open("example.png")
if err != nil {panic(err)
}
defer file.Close()img, _, err := image.Decode(file)
if err != nil {panic(err)
}
// 使用解码后的img进行后续操作
image.DecodeConfig
仅解码图像的配置信息而不加载完整图像数据:
func DecodeConfig(r io.Reader) (cfg image.Config, err error)
file, err := os.Open("example.gif")
if err != nil {panic(err)
}
defer file.Close()config, err := image.DecodeConfig(file)
if err != nil {panic(err)
}
fmt.Printf("Image dimensions: %d x %d, Color model: %v\n", config.Width, config.Height, config.ColorModel)
案例
package mainimport ("image""image/draw""image/jpeg""os"
)func main() {// 读取原图file, err := os.Open("需要时jpeg格式的才行.jpeg")if err != nil {panic(err)}defer file.Close()img, err := jpeg.Decode(file)if err != nil {panic(err)}width := 600height := 400// 创建一个新的图片,大小为指定的宽和高newImg := image.NewRGBA(image.Rect(0, 0, width, height))// 裁剪图片 使用 draw.Draw 简单缩放(质量较低,可能会出现像素化)draw.Draw(newImg, newImg.Bounds(), img, image.Point{}, draw.Src)// 重新编码并保存outputFile, err := os.Create("output.jpg")if err != nil {panic(err)}defer outputFile.Close()// 设置压缩选项outputQuality := 80opts := &jpeg.Options{Quality: outputQuality,}err = jpeg.Encode(outputFile, newImg, opts)if err != nil {panic(err)}
}
使用 draw.Src
方式将原图直接绘制到目标图像上,这相当于最简单的像素复制,可能会导致图像质量下降,特别是对于缩小操作时,会出现明显的像素化现象。这种方法适用于对图像质量要求不高的场景,或者作为临时解决方案
请注意,这种方法并不推荐用于高质量的图像缩放,因为它没有采用任何插值算法来平滑过渡像素,导致缩放后的图像质量较差。对于实际项目中对图像大小调整的需求,建议使用专门的图像处理库如 github.com/nfnt/resize
它提供了多种高质量的插值算法(如 Lanczos 等),能够更好地保持图像细节和视觉效果。
这些只是image
包中的一部分功能。根据实际需求,还可以使用其他子包(如image/jpeg
, image/png
, image/gif
等)进行特定格式的编码和解码,或利用image/draw
包进行更复杂的图像合成操作。
使用第三方包处理
imaging一个简单、实用的图像处理工具
文档:
-
https://github.com/disintegration/imaging
-
https://pkg.go.dev/github.com/disintegration/imaging
-
Go Image Filtering Toolkit: https://github.com/disintegration/gift
安装
go get github.com/disintegration/imaging
package mainimport ("github.com/disintegration/imaging""log"
)func main() {// 打开一个图片文件src, err := imaging.Open("./1716282750475.jpg")if err != nil {log.Fatalf("无法打开图像: %v", err)}// 生成缩略图dst := imaging.Thumbnail(src, 100, 100, imaging.Lanczos)// 保存err = imaging.Save(dst, "thumbnail.jpg")if err != nil {log.Fatalf("无法保存图像: %v", err)} else {log.Println("保存图像成功")}
}