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)
将图片保存为文件(JPEG / PNG)
写入前需确保图像实现了对应编码器支持的类型(如 image.RGBA 或 image.NRGBA)。JPEG 不支持透明通道,PNG 支持;保存时需显式创建输出文件并传入写入器。
- JPEG 编码需指定质量(0–100),默认 75,用
jpeg.Encode(w, img, &jpeg.Options{Quality: 90}) - PNG 编码无参数,直接调用
png.Encode(w, img)即可 - 若原图是
*image.NRGBA但想存 JPEG,需先转换颜色模型(JPEG 不支持 alpha),可用draw.Draw()渲染到*image.RGBA
创建新图像并绘制简单内容
通过 image.NewRGBA() 创建空白画布,再用 draw.Draw() 或直接操作像素数组进行绘制。标准库不提供高级绘图函数(如画圆、文字),需自行实现或借助第三方库(如 fogleman/gg)。
立即学习“go语言免费学习笔记(深入)”;
-
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” - JPEG 解码后通常是
*image.YCbCr类型,不能直接保存为 PNG;需用image.NewRGBA(img.Bounds())并用draw.Draw转换 - 文件句柄记得关闭,建议用
defer f.Close();编码时也应检查写入错误(如磁盘满、权限不足) - 处理大图注意内存,
image.RGBA每像素占 4 字节,10MP 图约占用 40MB 内存










