← Imaging | Now 时间 →

gg - Go 图形绘制库

gg 是一个 2D 图形绘制库,提供了类似 Canvas 的 API,支持绘制形状、文本、图像等。掌握 gg 是开发图表、图像处理应用的基础。

基础绘制

📝 创建和保存

package main

import "github.com/fogleman/gg"

func main() {
    // 创建画布
    dc := gg.NewContext(400, 400)
    
    // 设置背景色
    dc.SetRGB(1, 1, 1)
    dc.Clear()
    
    // 保存为 PNG
    dc.SavePNG("output.png")
    
    // 保存为 JPG
    dc.SaveJPG("output.jpg", 90)
}

绘制形状

📝 基本形状

package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(400, 400)
    dc.SetRGB(1, 1, 1)
    dc.Clear()
    
    // 绘制点
    dc.SetRGB(1, 0, 0)
    dc.DrawPoint(50, 50, 5)
    dc.Fill()
    
    // 绘制直线
    dc.SetRGB(0, 1, 0)
    dc.MoveTo(100, 100)
    dc.LineTo(200, 200)
    dc.Stroke()
    
    // 绘制矩形
    dc.SetRGB(0, 0, 1)
    dc.DrawRectangle(50, 150, 100, 80)
    dc.Fill()
    
    // 绘制圆形
    dc.SetRGB(1, 1, 0)
    dc.DrawCircle(300, 100, 50)
    dc.Stroke()
    
    // 绘制椭圆
    dc.DrawEllipse(300, 250, 80, 40)
    dc.Fill()
    
    // 绘制圆弧
    dc.DrawArc(200, 300, 50, 0, gg.Radians(270))
    dc.Stroke()
    
    dc.SavePNG("shapes.png")
}

绘制文本

📝 文本渲染

package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(400, 400)
    dc.SetRGB(1, 1, 1)
    dc.Clear()
    
    // 加载字体
    if err := dc.LoadFontFace("arial.ttf", 24); err != nil {
        panic(err)
    }
    
    // 设置文本颜色
    dc.SetRGB(0, 0, 0)
    
    // 绘制文本
    dc.DrawString("Hello, World!", 50, 50)
    
    // 居中文本
    dc.DrawStringAnchored("Centered", 200, 200, 0.5, 0.5)
    
    // 多行文本
    dc.DrawStringWrapped(
        "This is a long text that wraps to multiple lines.",
        200, 300, 0.5, 0.5,
        150, 1.5,
    )
    
    dc.SavePNG("text.png")
}

高级功能

📝 变换和效果

package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(400, 400)
    dc.SetRGB(1, 1, 1)
    dc.Clear()
    
    // 平移
    dc.Translate(100, 100)
    dc.DrawCircle(0, 0, 50)
    dc.Fill()
    
    // 旋转
    dc.Rotate(gg.Radians(45))
    dc.DrawRectangle(-25, -25, 50, 50)
    dc.Fill()
    
    // 缩放
    dc.Scale(1.5, 1.5)
    dc.DrawCircle(100, 100, 30)
    dc.Fill()
    
    // 渐变填充
    dc.SetLinearGradient(0, 0, 400, 400)
    dc.DrawRectangle(0, 0, 400, 400)
    dc.Fill()
    
    // 加载和绘制图像
    img, _ := gg.LoadImage("input.png")
    dc.DrawImage(img, 50, 50)
    
    dc.SavePNG("advanced.png")
}