Skip to content

gg ​

阅读提示

  • 适用版本:Go 1.21+(示例在 Go 1.22 下验证)· 前置知识:语法基础-结构体 · 阅读时长:约 12 分钟

官方仓库:fogleman/gg: Go Graphics - 2D rendering in Go with a simple API. (github.com)

官方文档:gg package - github.com/fogleman/gg - Go Packages

官方示例:gg/examples at master · fogleman/gg (github.com)

gg是一个比较老牌的二维的图形渲染引擎,适合用于生成图片。

安装 ​

go get -u github.com/fogleman/gg

快速开始 ​

go
package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(1000, 1000) //创建画布 高1000 宽1000
    dc.DrawCircle(500, 500, 400) // 在 (500,500)坐标位置绘制一个半径400的圆
    dc.SetRGB(0, 0, 0) // 设置颜色黑色
    dc.Fill() // 填充
    dc.SavePNG("out.png") // 保存到图片文件
}

描点 ​

![](/images/gg/points.png =400x400)

go
func TestDot(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   for i := 1; i < 10; i++ {
      dc.DrawPoint(float64(50*i), float64(50*i), 5) // 设置点的坐标和半径
   }
   dc.Fill() // 填充
   dc.SavePNG("out.png")
}

画线 ​

![](/images/gg/lines.png =400x400)

go
func TestLines(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.SetLineWidth(5) // 设置线宽
   dc.DrawLine(1000, 0, 0, 1000)
   dc.DrawLine(1000, 1000, 0, 0)
   dc.Stroke() // 连线
   dc.SavePNG("lines.png")
}

完整示例 ​

下面的程序可以直接运行:复制到文件后执行 go run main.go,或粘贴到 Go Playground 运行。

go
package main

import "fmt"

func main() {
	// 用 5x3 的画布画对角线,类比 gg 的绘制上下文
	const w, h = 5, 3
	canvas := make([][]bool, h)
	for i := range canvas {
		canvas[i] = make([]bool, w)
	}
	for i := 0; i < h; i++ {
		canvas[i][i] = true
	}

	for _, row := range canvas {
		line := ""
		for _, on := range row {
			if on {
				line += "#"
			} else {
				line += "."
			}
		}
		fmt.Println(line)
	}
}

预期输出:

text
#....
.#...
..#..

常见错误与踩坑 ​

  • 别忘了 Stroke 或 Fill。 绘制命令只有调用 Stroke()/Fill() 后才真正生效。
  • 按需选择保存格式。 SavePNG 与 SaveJPG 在质量与透明度支持上不同。
  • 字体需要文件路径。 LoadFontFace 需要 TTF 文件,没有系统字体回退。
  • 上下文不是并发安全的。 在同一协程绘制,或自行加锁。
  • 大画布内存开销明显。 宽×高×4 字节增长很快,渲染帧序列时应复用缓冲。

更新记录 ​

  • 2026-10-14:新增"阅读提示"、完整可运行示例(含预期输出)、常见错误与踩坑清单,以及本更新记录。