golang 实现图片上绘制文字

发布时间 2023-08-07 17:04:48作者: 夕夢
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
}