Skip to content

gg

Kho lưu trữ chính thức: fogleman/gg: Go Graphics - 2D rendering in Go with a simple API. (github.com)

Tài liệu chính thức: gg package - github.com/fogleman/gg - Go Packages

Ví dụ chính thức: gg/examples at master · fogleman/gg (github.com)

gg là một công cụ render 2D lâu đời, thích hợp để tạo hình ảnh.

Cài đặt

go get -u github.com/fogleman/gg

Bắt đầu nhanh

go
package main

import "github.com/fogleman/gg"

func main() {
    dc := gg.NewContext(1000, 1000) // Tạo canvas cao 1000 rộng 1000
    dc.DrawCircle(500, 500, 400) // Vẽ hình tròn bán kính 400 tại tọa độ (500,500)
    dc.SetRGB(0, 0, 0) // Đặt màu đen
    dc.Fill() // Lấp đầy
    dc.SavePNG("out.png") // Lưu thành file ảnh
}

Điểm

![](/images/gg/points.png =400x400)

go
func TestDot(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   for i := 1; i < 10; i++ {
      dc.DrawPoint(float64(50*i), float64(50*i), 5) // Đặt tọa độ và bán kính điểm
   }
   dc.Fill() // Lấp đầy
   dc.SavePNG("out.png")
}

Vẽ đường thẳng

![](/images/gg/lines.png =400x400)

go
func TestLines(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.SetLineWidth(5) // Đặt độ rộng đường
   dc.DrawLine(1000, 0, 0, 1000)
   dc.DrawLine(1000, 1000, 0, 0)
   dc.Stroke() // Nối đường
   dc.SavePNG("lines.png")
}

Vẽ hình chữ nhật

![](/images/gg/rect.png =400x400)

go
func TestRect(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.DrawRectangle(100, 100, 800, 800) // Vẽ hình chữ nhật tại (100,100) rộng 800 cao 800
   dc.Stroke()
   dc.SavePNG("rect.png")
}

Vẽ hình elip

![](/images/gg/ellipse.png =400x400)

go
func TestEllipse(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.DrawEllipse(500, 500, 400, 200) // Vẽ hình elip tại (500,500) bán kính trục x 400 bán kính trục y 200
   dc.Stroke()
   dc.SavePNG("ellipse.png")
}

Vẽ cung tròn

![](/images/gg/arc.png =400x400)

go
func TestArc(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.DrawArc(500, 500, 400, gg.Radians(0), gg.Radians(270)) // Vẽ cung tròn
   dc.Stroke()
   dc.SavePNG("arc.png")
}

Vẽ đường cong bezier

![](/images/gg/bezier.png =400x400)

go
func TestBezier(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(0, 0, 0)
   dc.DrawLine(100, 500, 900, 500)
   dc.DrawQuadBezier(100, 500, 500, 100, 900, 500) // Vẽ đường cong bezier bậc 2
   dc.DrawCubicBezier(100, 500, 300, 900, 700, 100, 900, 500) // Vẽ đường cong bezier bậc 3
   dc.Stroke()
   dc.SavePNG("bezier.png")
}

Vẽ văn bản

![](/images/gg/text.png =400x400)

go
func TestText(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(1, 1, 1)
   dc.Clear()
   dc.SetRGB(0, 0, 0)
   dc.LoadFontFace("font.ttf", 72) // Tải font chữ
   dc.DrawString("Hello, World!", 500, 500) // Vẽ chuỗi tại (500,500)
   dc.SavePNG("text.png")
}

Vẽ hình ảnh

![](/images/gg/image.png =400x400)

go
func TestImage(t *testing.T) {
   dc := gg.NewContext(1000, 1000)
   dc.SetRGB(1, 1, 1)
   dc.Clear()
   img, _ := image.Load("input.png") // Tải ảnh
   dc.DrawImage(img, 100, 100) // Vẽ ảnh tại (100,100)
   dc.SavePNG("image.png")
}

Các phương thức hữu ích

go
// Tạo context mới
func NewContext(width, height int) *Context

// Xóa canvas
func (dc *Context) Clear()

// Đặt màu nền
func (dc *Context) SetRGB(r, g, b float64)

// Đặt độ rộng đường
func (dc *Context) SetLineWidth(width float64)

// Đặt màu đường
func (dc *Context) SetStrokeColor(c color.Color)

// Đặt màu lấp đầy
func (dc *Context) SetFillColor(c color.Color)

// Lưu thành file PNG
func (dc *Context) SavePNG(path string) error

// Lưu thành file JPEG
func (dc *Context) SaveJPEG(path string, quality int) error

// Xoay
func (dc *Context) Rotate(angle float64)

// Tỷ lệ
func (dc *Context) Scale(x, y float64)

// Dịch chuyển
func (dc *Context) Translate(x, y float64)

Best Practices

  1. Quản lý bộ nhớ: Giải phóng context sau khi sử dụng xong
  2. Chất lượng ảnh: Sử dụng chất lượng phù hợp khi lưu JPEG
  3. Font chữ: Đảm bảo file font chữ tồn tại trước khi tải
  4. Hiệu suất: Tái sử dụng context khi có thể
  5. Tọa độ: Chú ý hệ tọa độ bắt đầu từ góc trên bên trái

Kết luận

gg là một thư viện mạnh mẽ và dễ sử dụng cho việc tạo và xử lý hình ảnh 2D trong Go. Với API đơn giản và nhiều tính năng hữu ích, gg là lựa chọn tuyệt vời cho việc tạo ảnh động, biểu đồ, và các ứng dụng đồ họa 2D khác.

Golang by www.golangdev.cn edit