Go标准库image包纯Go实现,支持JPEG/PNG/GIF编解码;需手动注册解码器,image.Image只读,保存时注意格式限制与颜色模型转换,大图需关注内存占用。
Go 语言标准库中的 image 包提供了基础的图像解码、编码和像素操作能力,配合 image/jpeg、image/png、image/gif 等子包,可以轻松完成常见图片文件的读取与生成。它不依赖 C 库,纯 Go 实现,跨平台且轻量。
Go 不会自动根据文件扩展名选择解码器,需手动注册并调用对应解码函数。常用流程是:打开文件 → 检测格式(或直接按已知类型解码)→ 解码为 image.Image 接口实例。
image.Decode() 可自动识别 JPEG、PNG、GIF 格式(前提是已导入对应包,如 _ "image/jpeg")jpeg.Decode()),性能略高且错误信息更明确image.Image 是只读接口,返回的图像是原始像素副本,修改需转为可变类型(如 *image.RGBA)写入前需确保图像实现了对应编码器支持的类型(如 image.RGBA 或 image.NRGBA)。JPEG 不支持透明通道,PNG 支持;保存时需显式创建输出文件并传入写入器。
jpeg.Encode(w, img, &jpeg.Options{Quality: 90})
png.Encode(w, img) 即可*image.NRGBA 但想存 JPEG,需先转换颜色模型(JPEG 不支持 alpha),可用 draw.Draw() 渲染到 *image.RGBA
通过 image.NewRGBA() 创建空白画布,再用 draw.Draw() 或直接操作像素数组进行绘制。标准库不提供高级绘图函数(如画圆、文字),需自行实现或借助第三方库(如 fogleman/gg)。
image.Rect(0, 0, w, h) 定义图像边界,作为 NewRGBA 的参数img.Set(x, y, color.RGBA{255,0,0,255})
draw.Draw() 将一个纯色 *image.Uniform 图像绘制到目标区域实际使用中容易忽略编码/解码的细节,导致黑图、错色或 panic。
_ "image/png",此时 image.Decode 返回 “unknown format”*image.YCbCr
类型,不能直接保存为 PNG;需用 image.NewRGBA(img.Bounds()) 并用 draw.Draw 转换defer f.Close();编码时也应检查写入错误(如磁盘满、权限不足)image.RGBA 每像素占 4 字节,10MP 图约占用 40MB 内存