Browse Source

feat: 水印

wangkang 1 month ago
parent
commit
91f880d244
2 changed files with 124 additions and 0 deletions
  1. BIN
      common/watermark/font.ttf
  2. 124 0
      common/watermark/water.go

BIN
common/watermark/font.ttf


+ 124 - 0
common/watermark/water.go

@@ -0,0 +1,124 @@
+package watermark
+
+import (
+	_ "embed"
+	"image"
+	"image/color"
+	"image/draw"
+	"image/jpeg"
+	"image/png"
+	"os"
+	"time"
+
+	"github.com/goki/freetype"
+	"github.com/goki/freetype/truetype"
+)
+
+//go:embed font.ttf
+var ttfBytes []byte
+
+// 添加水印
+func Add(path string) error {
+	f, err := os.Open(path)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	origin, err := png.Decode(f)
+	if err != nil {
+		return err
+	}
+	// 新建一个画布,把原图、水印、文字叠加上去
+	newImage := image.NewRGBA(origin.Bounds())
+	// 叠加原图
+	draw.Draw(newImage, origin.Bounds(), origin, image.Point{}, draw.Over)
+	// 加载字体
+	font, err := GetFont()
+	if err != nil {
+		return err
+	}
+	fc := freetype.NewContext()   // xx
+	fc.SetDPI(72)                 // dpi
+	fc.SetFont(font)              // 字体
+	fc.SetFontSize(24)            // 字体大小(磅)
+	fc.SetClip(newImage.Bounds()) // 设置剪裁矩形以进行绘制
+	fc.SetDst(newImage)           // 设置目标图像(字体加在哪里)
+	//fc.SetSrc(image.Black)        // 字体颜色
+	// 可根据 RGBA 设置颜色
+	fc.SetSrc(image.NewUniform(color.RGBA{R: 255, G: 0, B: 0, A: 255}))
+	text := "截图时间:" + time.Now().Format("2006-01-02 15:04:05")
+	// 字体水印位置:在水印位置的基础上 偏移 Y 轴 380 * 24
+	fontPt := freetype.Pt(origin.Bounds().Max.X-400, 24)
+	if _, err = fc.DrawString(text, fontPt); err != nil {
+		return err
+	}
+	// 创建水印文件
+	created, err := os.Create(path)
+	if err != nil {
+		return err
+	}
+	defer created.Close()
+	// 写入
+	if err = jpeg.Encode(created, newImage, &jpeg.Options{Quality: 80}); err != nil {
+		return err
+	}
+	return nil
+}
+
+// 添加水印
+func AddTaxErrInfo(path string) error {
+	f, err := os.Open(path)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	origin, err := png.Decode(f)
+	if err != nil {
+		return err
+	}
+	// 新建一个画布,把原图、水印、文字叠加上去
+	newImage := image.NewRGBA(origin.Bounds())
+	// 叠加原图
+	draw.Draw(newImage, origin.Bounds(), origin, image.Point{}, draw.Over)
+	// 加载字体
+	font, err := GetFont()
+	if err != nil {
+		return err
+	}
+	fc := freetype.NewContext()   // xx
+	fc.SetDPI(72)                 // dpi
+	fc.SetFont(font)              // 字体
+	fc.SetFontSize(24)            // 字体大小(磅)
+	fc.SetClip(newImage.Bounds()) // 设置剪裁矩形以进行绘制
+	fc.SetDst(newImage)           // 设置目标图像(字体加在哪里)
+	//fc.SetSrc(image.Black)        // 字体颜色
+	// 可根据 RGBA 设置颜色
+	fc.SetSrc(image.NewUniform(color.RGBA{R: 255, G: 0, B: 0, A: 255}))
+	text := "截图时间:" + time.Now().Format("2006-01-02 15:04:05")
+	// 字体水印位置:在水印位置的基础上 偏移 Y 轴 380 * 24
+	fontPt := freetype.Pt(origin.Bounds().Max.X-400, 24)
+	if _, err = fc.DrawString(text, fontPt); err != nil {
+		return err
+	}
+	fontPt2 := freetype.Pt(origin.Bounds().Dx()/2-130, origin.Bounds().Dy()/2)
+	text2 := "税局页面卡顿,加载失败!"
+	if _, err = fc.DrawString(text2, fontPt2); err != nil {
+		return err
+	}
+	// 创建水印文件
+	created, err := os.Create(path)
+	if err != nil {
+		return err
+	}
+	defer created.Close()
+	// 写入
+	if err = jpeg.Encode(created, newImage, &jpeg.Options{Quality: 80}); err != nil {
+		return err
+	}
+	return nil
+}
+
+// GetFont 获取字体
+func GetFont() (*truetype.Font, error) {
+	return freetype.ParseFont(ttfBytes)
+}