package main
import (
"github.com/golang/freetype"
"image"
"image/draw"
"image/png"
"io/ioutil"
"log"
"os"
)
// TextInfo 文字信息
type TextInfo struct {
Text string // 文字内容
Size float64 // 文字大小
X int // 位置信息
Y int // 位置信息
}
// ImageInfo 图片信息
type ImageInfo struct {
Path string // 图片路径
Width int // 图片宽
Height int // 图片高
}
func main() {
imageInfo := ImageInfo{
Path: "in.png",
Width: 1000,
Height: 1000,
}
textInfo := []TextInfo{
{
Text: "测试文字1",
Size: 20,
X: 100,
Y: 200,
},
{
Text: "测试文字2",
Size: 30,
X: 500,
Y: 600,
},
}
err := ImageSeedText(imageInfo, textInfo, "font.ttf", "out.png")
if err != nil {
log.Fatalln(err)
}
}
func ImageSeedText(imageInfo ImageInfo, textInfo []TextInfo, fontPath string, outImagePath string) error {
// 生成画布
file, err := os.Open(imageInfo.Path)
if err != nil {
return err
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return err
}
dst := image.NewRGBA(image.Rect(0, 0, imageInfo.Width, imageInfo.Height))
draw.Draw(dst, dst.Bounds(), img, img.Bounds().Min, draw.Over)
// 加载字体文件
fontBytes, err := ioutil.ReadFile(fontPath)
if err != nil {
return err
}
font, err := freetype.ParseFont(fontBytes)
if err != nil {
return err
}
// 生成文字信息
for _, v := range textInfo {
f := freetype.NewContext()
f.SetDPI(72)
f.SetFont(font) // 加载字体
f.SetFontSize(v.Size) // 设置字体尺寸
f.SetClip(dst.Bounds())
f.SetDst(dst)
f.SetSrc(image.Black) // 设置字体颜色
// 位置信息
pt := freetype.Pt(v.X, v.Y)
_, err = f.DrawString(v.Text, pt)
if err != nil {
return err
}
}
// 以png的格式写入文件
outFil, err := os.Create(outImagePath)
if err != nil {
return err
}
defer outFil.Close()
err = png.Encode(outFil, dst)
if err != nil {
return err
}
return nil
}
golang 实现图片上绘制文字
发布时间 2023-08-07 17:04:48作者: 夕夢