简介:什么是 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.ttfsimhei.ttf
  • 坐标系为浮点型,部分绘图需手动对齐像素避免模糊。

官方资源

gg 是 Go 语言生态中功能完善、使用简单的 2D 图形库,适合用于自动化图像生成、数据可视化、模板合成等任务。配合标准库中的 image 包,可扩展出更强大的图像处理功能。对于希望在 Go 中进行图形编程的开发者来说,是一个非常推荐的选择。


孟斯特

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