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

Go语言的image包提供了轻量、标准且可扩展的图片处理能力,适合做基础图像读写、格式转换和像素级操作。它不依赖C库,纯Go实现,跨平台稳定,但不适用于复杂图形渲染或深度学习场景。
Go默认只注册png解码器,jpeg和gif需手动导入对应包才能识别:
import _ "image/jpeg" —— 启用JPEG读写import _ "image/gif" —— 启用GIF读写image.Decode()从io.Reader(如文件、HTTP响应)解析为image.Image接口示例:
f, _ := os.Open("photo.jpg")
defer f.Close()
img, _, _ := image.Decode(f) // 自动识别格式
image包本身不提供统一写入接口,需根据目标格式调用对应编码器:
立即学习“go语言免费学习笔记(深入)”;
jpeg.Encode(w io.Writer, img image.Image, opt *jpeg.Options)
png.Encode(w io.Writer, img image.Image)
gif.Encode(w io.Writer, img image.Image, opt *gif.Options)
注意:jpeg.Encode要求输入图像类型为*image.YCbCr或能转为YCbCr(如image.RGBA需先转换),否则会报错;推荐用image.NewRGBA创建可写图像后再编码。
标准image.Image是只读接口,要改像素必须转为可写的子类型,最常用的是*image.RGBA:
img.Bounds()获取图像范围(矩形区域)rgba.At(x, y)读取指定位置颜色(返回color.Color)rgba.Set(x, y, color.RGBA{R,G,B,A})写入新像素值rgba.Pix字节切片:每个像素占4字节(R,G,B,A),索引公式为(y*rgba.Stride + x*4)
示例(灰度化):
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,包含Min和Max点,宽高需用Dx()/Dy()计算。
color.RGBA读出时已左移8位(0–65535),需右移8位还原为0–255Pix切片而非Set/At,性能可提升10倍以上github.com/disintegration/imaging
不复杂但容易忽略。
以上就是如何使用Golang image处理图片_读取、写入和修改像素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号