Go 圖形庫: github-com-fogleman-gg
簡介:什麼是 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")
優點總結
注意事項
-
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 中進行圖形編程的開發者來說,是一個非常推薦的選擇。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/RRzlevJ-IumvVDt0X4FaSA