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