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()

說明:

設置顏色

支持兩種設置方式:

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")

優點總結

AKqStQ

注意事項

官方資源

gg 是 Go 語言生態中功能完善、使用簡單的 2D 圖形庫,適合用於自動化圖像生成、數據可視化、模板合成等任務。配合標準庫中的 image 包,可擴展出更強大的圖像處理功能。對於希望在 Go 中進行圖形編程的開發者來說,是一個非常推薦的選擇。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RRzlevJ-IumvVDt0X4FaSA