简介:什么是 gg
gg
是由 Fogleman 开发的一个用 Go 编写的 2D 图形绘制库,灵感来源于 Python 的 Cairo 和 Processing 项目。gg
旨在提供简洁、直观的 API,以实现图像绘制、文本渲染、图形组合等操作,适用于图像处理、数据可视化、图像合成等多种用途。
适用场景包括:
- 图像处理(添加水印、标识等)
- 数据可视化(绘图、图表生成)
- 自定义图像合成(如生成证书、卡片、邀请函)
- 动态图像内容生成(图文融合、海报输出等)
安装方式
使用 Go Modules 方式安装:
go get github.com/fogleman/gg
或在 go.mod
中添加依赖:
require github.com/fogleman/gg v1.3.0
核心设计理念
gg
的设计以一个名为 Context
的绘图上下文对象为中心。所有绘图行为(包括路径绘制、颜色设置、文本渲染等)都通过该对象完成。
dc := gg.NewContext(width, height)
可理解为:Context
是一块画布,你可以在其上绘制形状、图片、文本等。
基本用法
创建画布
const W = 800
const H = 600
dc := gg.NewContext(W, H)
这将创建一个大小为 800×600 的空白画布。
设置背景色并清空
dc.SetRGB(1, 1, 1) // 设置为白色
dc.Clear() // 使用当前颜色清空背景
或绘制矩形背景:
dc.SetRGB(0.5, 0.5, 0.5) // 灰色
dc.DrawRectangle(0, 0, W, H)
dc.Fill()
基本绘图功能
绘制图形元素
dc.DrawLine(10, 10, 200, 200)
dc.Stroke()
dc.DrawRectangle(100, 100, 200, 150)
dc.Fill()
dc.DrawCircle(400, 300, 100)
dc.Stroke()
说明:
Stroke()
表示描边Fill()
表示填充- 两者可配合使用
设置颜色
支持两种设置方式:
dc.SetRGB(1, 0, 0) // 设置为红色,RGB 值为 0~1
dc.SetRGB255(255, 0, 0) // 设置为红色,RGB 值为 0~255
渲染文本
加载字体并绘制文本:
err := dc.LoadFontFace("Arial.ttf", 24)
if err != nil {
log.Fatal(err)
}
dc.SetRGB(0, 0, 0)
dc.DrawString("Hello, World", 100, 100)
支持 .ttf
字体文件,字体路径必须存在,字体大小单位为像素。
文本自动换行及居中绘制
dc.DrawStringWrapped(
"This is a long sentence that needs to be wrapped.",
100, 200, // 起点位置
0.5, 0.5, // 水平、垂直对齐(0 = 左/上, 0.5 = 居中)
300, // 最大宽度
1.5, // 行间距倍数
gg.AlignCenter, // 水平对齐方式
)
加载和绘制图片
img, err := gg.LoadImage("photo.jpg")
if err != nil {
log.Fatal(err)
}
dc.DrawImage(img, 50, 50)
可用于合成模板图、头像、图标等。
图像变换与控制
缩放、旋转、移动
dc.Scale(2, 2) // 缩放坐标系统
dc.Rotate(gg.Radians(45)) // 顺时针旋转 45 度
dc.Translate(100, 200) // 平移坐标系统
变换操作会影响后续所有绘图操作。
保存与恢复状态
dc.Push() // 保存当前状态
dc.Translate(50, 50)
dc.Pop() // 恢复到上次 Push() 时的状态
适合局部变换场景,避免影响全局绘图状态。
图像导出
保存为 PNG 文件:
dc.SavePNG("output.png")
也可导出为 JPEG、GIF(需配合标准库编码):
png.Encode(file, dc.Image()) // 或使用 image/jpeg, image/gif 编码器
高级功能
绘制路径(贝塞尔曲线等)
dc.MoveTo(100, 100)
dc.LineTo(200, 200)
dc.QuadraticTo(300, 300, 400, 100)
dc.ClosePath()
dc.Stroke()
支持直线、二次/三次贝塞尔曲线、路径闭合等。
实战案例
生成付款回执图像
适用于票据、订单图、凭证等图像合成:
bg, _ := gg.LoadImage("receipt_bg.png")
dc := gg.NewContextForImage(bg)
dc.LoadFontFace("arial.ttf", 18)
dc.SetRGB255(153, 0, 0)
dc.DrawString("姓名: Anilkumarvs", 100, 100)
dc.SavePNG("receipt_output.png")
优点总结
优点 | 描述 |
---|---|
接口简洁 | API 风格统一,易于上手 |
字体渲染能力强 | 支持 TTF 字体加载,中文支持取决于字体文件 |
图形绘制丰富 | 提供基本几何图形、路径、图像合成功能 |
支持图层变换 | 缩放、旋转、平移变换灵活,可局部绘制 |
高性能 | 基于 Go 原生 image 库构建,运行速度快 |
注意事项
gg
是 2D 图形库,不支持 3D 渲染。- 不支持 SVG 直接导入,如需使用可转换为图片格式。
- 字体路径需自行提供,建议使用支持中文的字体如
msyh.ttf
或simhei.ttf
。 - 坐标系为浮点型,部分绘图需手动对齐像素避免模糊。
官方资源
- GitHub 项目主页:https://github.com/fogleman/gg
- GoDoc 文档:https://pkg.go.dev/github.com/fogleman/gg
- 示例画廊:https://github.com/fogleman/gg#examples
gg
是 Go 语言生态中功能完善、使用简单的 2D 图形库,适合用于自动化图像生成、数据可视化、模板合成等任务。配合标准库中的 image
包,可扩展出更强大的图像处理功能。对于希望在 Go 中进行图形编程的开发者来说,是一个非常推荐的选择。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
腾讯云开发者社区:孟斯特
—