|
@@ -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)
|
|
|
+}
|