你有没有想过,只需几行 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(1, 1, 1)
// 获取画布尺寸
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(0, 0, 0, 0.6)
context.DrawRoundedRectangle(boxX, boxY, boxWidth, boxHeight, cornerRadius)
context.Fill()
// 画文字(居中)
context.SetRGB(1, 1, 1)
context.DrawStringAnchored(text, float64(width)/2, float64(height)/2, 0.5, 0.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
使用说明
-
- 准备几张背景图放在
assets/images/文件夹中。
- 准备几张背景图放在
-
- 下载你喜欢的
.ttf字体文件,放在assets/fonts/文件夹下。
- 下载你喜欢的
-
- 使用
go run main.go运行程序。
- 使用
-
- 输入你想生成的文字,图片将自动生成在当前目录。
扩展建议
- • 支持文字自动换行(
DrawStringWrapped) - • 命令行参数传入文字
go run main.go "心之所向,素履以往" - • Web 版本封装成 HTTP 接口(结合 Gin 框架)
- • 打包为桌面工具或 CLI 工具
总结
使用 Go 来制作图像处理工具,其实一点也不难!借助 gg,我们可以轻松实现文本绘制、图像合成等需求。
如果你是 Go 爱好者、效率工具党、社交媒体重度用户,这个小项目值得一试!
喜欢这类实用教程?欢迎点赞收藏+关注,我会持续分享更多有趣实用的 Go 项目!
需要我帮你封装成 Web 服务或者生成命令行工具版吗?评论告诉我~