This commit is contained in:
zyj
2025-09-13 10:22:49 +08:00
commit 002419a7ed
28 changed files with 1888 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
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
}