Files
go-account-register/utils/verify_image_plugin.go
2025-09-13 10:22:49 +08:00

86 lines
2.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}