跳到正文
源码达人

使用 gg 库实现文本生成

Golang 柠檬鱼

需求

需要实现一个文本生成器,可以接受以下参数:

  • 文本内容
  • 字体路径
  • 背景图片路径
  • 字体大小

生成的文本需要以背景图片为底,将文本按照指定字体、大小进行绘制。

实现

为了实现上述需求,我使用了go语言中的gg库。gg库是一个轻量级的2D绘图库,提供了简单易用的API,可以方便地进行图形绘制。

具体实现步骤如下:

  1. 使用gg.NewContextWithFile()方法创建一个新的绘图上下文,同时指定背景图片路径。
  2. 使用gg.LoadFontFace()方法加载指定字体文件。
  3. 使用ctx.DrawStringAnchored()方法将文本绘制在背景图片上,同时指定字体和大小。

以下是具体的代码实现:

package main

import (
	"github.com/fogleman/gg"
	"image"
	"os"
)

func generateFontImage(text string, path string, backgroundImagePath string, fontsize float64) {

	backgroundImage, err := loadImage(backgroundImagePath)
	if err != nil {
		panic(err)
	}

	dc := gg.NewContextForImage(backgroundImage)
	err = dc.LoadFontFace(path, fontsize)
	if err != nil {
		panic(err)
	}
	dc.SetRGB(0, 0, 0)
	// 设置文字角度
	//dc.Rotate(gg.Radians(-5))
	dc.DrawStringAnchored(text, float64(dc.Width())/2, float64(dc.Height())/2, 0.5, 0.5)

	dc.Stroke()
	err = dc.SavePNG("font_image.png")
	if err != nil {
		panic(err)
	}
}

func loadImage(path string) (image.Image, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()
	img, _, err := image.Decode(file)
	if err != nil {
		return nil, err
	}
	return img, nil
}

func main() {
	// font.ttf和image.jpeg与main.go同级
	generateFontImage("我要当cto", "font.ttf", "image.jpeg", 80)
}

测试效果:

测试效果

总结

使用gg库可以方便地实现文本生成器的功能,同时可以通过调整字体、大小、位置等参数,生成不同样式的文本。需要注意的是,在绘制文本之前,需要先加载指定字体文件,并且保证背景图片的路径正确。