创建 image.RGBA 画布需注意:原点在左上角,尺寸用 image.Rect(0,0,w,h) 表示宽高而非右下坐标;负数或非整数尺寸会 panic 或报错;大图需预估内存;绘图须显式指定 draw.Src 模式;保存 PNG 前必须 Close 文件。

用 image.NewRGBA 创建画布前必须注意尺寸和坐标系
Go 的 image.RGBA 画布原点在左上角,x 向右递增、y 向下递增——这和数学直角坐标系相反,但和 PNG 文件规范一致。创建时传入的 image.Rect(0, 0, w, h) 表示宽 w、高 h,不是「右下角坐标」;如果误写成 image.Rect(0, 0, w-1, h-1),画布会小一圈,后续绘图直接越界静默失败。
-
image.NewRGBA分配的是完整内存(w × h × 4字节),大图要预估内存,比如 10000×10000 就要约 400MB - 宽高必须 ≥ 0,传负数会导致 panic:「invalid image: negative dimension」
- 不支持非整数尺寸,缩放或抗锯齿需额外用
golang.org/x/image/draw
往 draw.Draw 里填图像时别漏掉 draw.Src 模式
draw.Draw 是标准库里最常用的绘制函数,但它不会自动“叠加”或“混合”,默认行为是“覆盖”——但前提是显式指定 draw.Src。漏写这个参数,它会用零值 draw.Over,而 Over 要求源图带 alpha 通道且目标图可读,否则结果全黑或空白。
- 纯色填充:先用
image.NewUniform(color.RGBA{...})构造源图,再调draw.Draw(dst, dst.Bounds(), src, image.Point{}, draw.Src) - 复制子区域:确保
src.Bounds().Min和dst.Bounds().Min对齐,否则偏移错位 - 目标区域超出画布边界时,
draw.Draw自动裁剪,不 panic,但容易误以为绘图失败
保存 PNG 时 png.Encode 失败的常见原因
png.Encode 写入失败通常不是编码问题,而是 I/O 层面被忽略的细节:文件路径不存在、目录无写权限、*os.File 没 Close() 导致内容没刷盘、或者传了只读的 io.Reader。
- 务必检查
os.Create返回的 error,Windows 下路径含\但 Go 期望/或filepath.Join - 写完立刻
file.Close(),否则文件可能为空或损坏(尤其在 CI 环境中) -
png.Encode不接受image.NRGBA等其他格式,必须是image.RGBA或能转成它的类型;用image.Convert显式转换更安全
画线/画圆没有内置函数,得手撸或引入第三方
标准库 image/draw 只提供矩形填充和图像合成,不包含 DrawLine、DrawCircle 这类几何绘制。有人试图用 draw.Draw + 单像素图反复调用,性能极差且锯齿严重。
立即学习“go语言免费学习笔记(深入)”;
- 简单线段可用 Bresenham 算法自己实现,注意边界判断(避免写到画布外)
- 需要抗锯齿、曲线、文字等,建议用
github.com/fogleman/gg(轻量)或github.com/disintegration/imaging(功能全) - 所有自定义绘制最终都要落到
dst.Set(x, y, color),注意x和y必须在dst.Bounds()内,越界不报错但无效
image.Rect 的语义、draw.Src 的必要性、以及 PNG 保存时那个没 Close() 的文件句柄。










