86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
package utils
|
||
|
||
import (
|
||
"image"
|
||
"image/color"
|
||
"image/draw"
|
||
_ "image/jpeg"
|
||
"image/png"
|
||
"log"
|
||
"os"
|
||
|
||
"github.com/golang/freetype"
|
||
"golang.org/x/image/font"
|
||
)
|
||
|
||
type VerifyImagePlugin struct{}
|
||
|
||
func (*VerifyImagePlugin) DrawText(originalImage, newImage, text, fontPath string) (string, error) {
|
||
srcFile, err := os.Open(originalImage) // 替换为你的图片路径
|
||
if err != nil {
|
||
log.Fatal("图片打开失败:", err)
|
||
return "", err
|
||
}
|
||
defer srcFile.Close()
|
||
|
||
// 解码原始图片
|
||
img, _, err := image.Decode(srcFile)
|
||
if err != nil {
|
||
log.Fatal("图片解码失败,只支持jpg、png:", err)
|
||
return "", err
|
||
}
|
||
|
||
rgba := image.NewRGBA(img.Bounds())
|
||
draw.Draw(rgba, rgba.Bounds(), img, image.Point{}, draw.Src)
|
||
var fontStr string = fontPath
|
||
if fontPath == "" {
|
||
fontStr = "fonts/AlibabaPuHuiTi-3-115-Black.ttf"
|
||
}
|
||
fontBytes, err := os.ReadFile(fontStr) // 替换为你的字体路径
|
||
if err != nil {
|
||
log.Fatal("字体加载失败:", err)
|
||
return "", err
|
||
}
|
||
fontObj, err := freetype.ParseFont(fontBytes)
|
||
if err != nil {
|
||
log.Fatal("字体解析失败:", err)
|
||
return "", err
|
||
}
|
||
|
||
c := freetype.NewContext()
|
||
c.SetDPI(72) // 屏幕分辨率
|
||
c.SetFont(fontObj) // 设置中文字体
|
||
c.SetFontSize(40) // 字体大小(磅)
|
||
c.SetClip(rgba.Bounds()) // 绘制区域
|
||
c.SetDst(rgba) // 目标画布
|
||
c.SetSrc(image.NewUniform(color.RGBA{ // 文字颜色
|
||
R: 255,
|
||
G: 255,
|
||
B: 255,
|
||
A: 255,
|
||
}))
|
||
c.SetHinting(font.HintingFull) // 增强小字清晰度
|
||
|
||
x := 150 // 水平起始位置
|
||
y := 250 // 垂直起始位置
|
||
yBase := y + int(c.PointToFixed(40)>>6) // 关键:修正垂直偏移
|
||
pt := freetype.Pt(x, yBase)
|
||
|
||
if _, err := c.DrawString(text, pt); err != nil {
|
||
log.Fatal("文字绘制失败:", err)
|
||
}
|
||
|
||
outFile, err := os.Create(newImage)
|
||
if err != nil {
|
||
log.Fatal("输出文件创建失败:", err)
|
||
return "", err
|
||
}
|
||
defer outFile.Close()
|
||
if err := png.Encode(outFile, rgba); err != nil {
|
||
log.Fatal("图片保存失败:", err)
|
||
return "", err
|
||
}
|
||
log.Println("成功生成:output.png")
|
||
return newImage, nil
|
||
}
|