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