需求
需要实现一个文本生成器,可以接受以下参数:
- 文本内容
- 字体路径
- 背景图片路径
- 字体大小
生成的文本需要以背景图片为底,将文本按照指定字体、大小进行绘制。
实现
为了实现上述需求,我使用了go语言中的gg库。gg库是一个轻量级的2D绘图库,提供了简单易用的API,可以方便地进行图形绘制。
具体实现步骤如下:
- 使用gg.NewContextWithFile()方法创建一个新的绘图上下文,同时指定背景图片路径。
- 使用gg.LoadFontFace()方法加载指定字体文件。
- 使用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库可以方便地实现文本生成器的功能,同时可以通过调整字体、大小、位置等参数,生成不同样式的文本。需要注意的是,在绘制文本之前,需要先加载指定字体文件,并且保证背景图片的路径正确。