需求

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

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

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

实现

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