用 Go 打造“文字海报生成器”:5 秒生成一张带字背景图!

397 阅读3分钟

你有没有想过,只需几行 Go 代码,就能像“毒鸡汤生成器”“金句分享工具”一样,自动在精美背景图上生成文字?今天这篇文章,就带你用 Go + gg 图形库,轻松实现一个命令行小工具 —— 自动生成带文字的海报图!

无论是用来分享朋友圈文案、短句,还是作为个人签名封面图,这个工具都能派上大用场。


效果展示

运行程序,输入一句话:

请输入要生成的文字:
生活不止眼前的苟且,还有诗和远方
Image saved as output_image.png

生成的图片就像这样:

(中间显示文字,背景图随机选取,文字配黑色半透明底框)


工程目录结构

poster-generator/
├── main.go
├── assets/
│   ├── images/
│   │   ├── background1.jpg
│   │   ├── background2.jpg
│   │   └── ...
│   └── fonts/
│       └── AlibabaPuHuiTi-3-55-Regular.ttf
└── output_image.png

完整代码

将以下代码保存为 main.go,记得提前准备图片和字体文件放入相应目录:

package main

import (
    "bufio"
    "fmt"
    "github.com/fogleman/gg"
    "math/rand"
    "os"
    "strings"
    "time"
)

// 背景图片路径列表
var backgroundImages = []string{
    "assets/images/background1.jpg",
    "assets/images/background2.jpg",
    "assets/images/background3.jpg",
    "assets/images/background4.jpg",
    "assets/images/background5.jpg",
    "assets/images/background6.jpg",
}

func generateImage(text string) error {
    // 随机选择背景图片
    rand.Seed(time.Now().UnixNano())
    backgroundPath := backgroundImages[rand.Intn(len(backgroundImages))]

    // 加载背景图片
    img, err := gg.LoadImage(backgroundPath)
    if err != nil {
        return fmt.Errorf("failed to load image: %v", err)
    }

    // 创建画布
    context := gg.NewContextForImage(img)

    // 加载字体
    err = context.LoadFontFace("assets/fonts/AlibabaPuHuiTi-3-55-Regular.ttf"42)
    if err != nil {
        return fmt.Errorf("failed to load font: %v", err)
    }

    // 设置文字颜色为白色
    context.SetRGB(111)

    // 获取画布尺寸
    width := context.Width()
    height := context.Height()

    // 测量文字尺寸
    textWidth, textHeight := context.MeasureString(text)

    // 设置底框参数
    padding := 20.0
    boxWidth := textWidth + 2*padding
    boxHeight := textHeight + 2*padding
    boxX := (float64(width) - boxWidth) / 2
    boxY := (float64(height) - boxHeight) / 2
    cornerRadius := 35.0

    // 画黑色半透明圆角底框
    context.SetRGBA(0000.6)
    context.DrawRoundedRectangle(boxX, boxY, boxWidth, boxHeight, cornerRadius)
    context.Fill()

    // 画文字(居中)
    context.SetRGB(111)
    context.DrawStringAnchored(text, float64(width)/2float64(height)/20.50.5)

    // 保存为 PNG 图片
    outputPath := "output_image.png"
    err = context.SavePNG(outputPath)
    if err != nil {
        return fmt.Errorf("failed to save image: %v", err)
    }

    fmt.Println("Image saved as", outputPath)
    return nil
}

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Println("请输入要生成的文字:")
    inputText, _ := reader.ReadString('\n')
    inputText = strings.TrimSpace(inputText)

    err := generateImage(inputText)
    if err != nil {
        fmt.Println("Error:", err)
    }
}

安装依赖

确保你已经安装了 Go 环境,然后使用如下命令拉取 gg 库:

go get github.com/fogleman/gg

使用说明

    1. 准备几张背景图放在 assets/images/ 文件夹中。
    1. 下载你喜欢的 .ttf 字体文件,放在 assets/fonts/ 文件夹下。
    1. 使用 go run main.go 运行程序。
    1. 输入你想生成的文字,图片将自动生成在当前目录。

扩展建议

  • • 支持文字自动换行(DrawStringWrapped
  • • 命令行参数传入文字 go run main.go "心之所向,素履以往"
  • • Web 版本封装成 HTTP 接口(结合 Gin 框架)
  • • 打包为桌面工具或 CLI 工具

总结

使用 Go 来制作图像处理工具,其实一点也不难!借助 gg,我们可以轻松实现文本绘制、图像合成等需求。

如果你是 Go 爱好者、效率工具党、社交媒体重度用户,这个小项目值得一试!


喜欢这类实用教程?欢迎点赞收藏+关注,我会持续分享更多有趣实用的 Go 项目!

需要我帮你封装成 Web 服务或者生成命令行工具版吗?评论告诉我~