通八洲科技

如何使用Golang image处理图片_读取、写入和修改像素

日期:2025-12-21 00:00 / 作者:P粉602998670
Go语言image包提供轻量跨平台图像处理能力,支持读写常见格式及像素操作,但需手动注册jpeg/gif解码器,写入需调用对应编码函数,修改像素推荐直接操作RGBA.Pix切片以提升性能。

Go语言的image包提供了轻量、标准且可扩展的图片处理能力,适合做基础图像读写、格式转换和像素级操作。它不依赖C库,纯Go实现,跨平台稳定,但不适用于复杂图形渲染或深度学习场景。

读取图片:支持常见格式,需注册解码器

Go默认只注册png解码器,jpeggif需手动导入对应包才能识别:

示例:

f, _ := os.Open("photo.jpg")
defer f.Close()
img, _, _ := image.Decode(f) // 自动识别格式

写入图片:按格式调用对应编码函数

image包本身不提供统一写入接口,需根据目标格式调用对应编码器:

注意:jpeg.Encode要求输入图像类型为*image.YCbCr或能转为YCbCr(如image.RGBA需先转换),否则会报错;推荐用image.NewRGBA创建可写图像后再编码。

修改像素:通过RGBA类型直接访问像素数组

标准image.Image是只读接口,要改像素必须转为可写的子类型,最常用的是*image.RGBA

示例(灰度化):

rgba := image.NewRGBA(img.Bounds())
draw.Draw(rgba, rgba.Bounds(), img, img.Bounds().Min, draw.Src)
for y := 0; y < rgba.Bounds().Dy(); y++ {
    for x := 0; x < rgba.Bounds().Dx(); x++ {
        r, g, b, _ := rgba.At(x, y).RGBA()
        gray := uint8((r>>8 + g>>8 + b>>8) / 3)
        rgba.Set(x, y, color.RGBA{gray, gray, gray, 255})
    }
}

注意事项与技巧

图像坐标原点在左上角,X向右递增,Y向下递增;Bounds()返回的是image.Rectangle,包含MinMax点,宽高需用Dx()/Dy()计算。

不复杂但容易忽略。