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 }