water.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package watermark
  2. import (
  3. _ "embed"
  4. "image"
  5. "image/color"
  6. "image/draw"
  7. "image/jpeg"
  8. "image/png"
  9. "os"
  10. "time"
  11. "github.com/goki/freetype"
  12. "github.com/goki/freetype/truetype"
  13. )
  14. //go:embed font.ttf
  15. var ttfBytes []byte
  16. // 添加水印
  17. func Add(path string) error {
  18. f, err := os.Open(path)
  19. if err != nil {
  20. return err
  21. }
  22. defer f.Close()
  23. origin, err := png.Decode(f)
  24. if err != nil {
  25. return err
  26. }
  27. // 新建一个画布,把原图、水印、文字叠加上去
  28. newImage := image.NewRGBA(origin.Bounds())
  29. // 叠加原图
  30. draw.Draw(newImage, origin.Bounds(), origin, image.Point{}, draw.Over)
  31. // 加载字体
  32. font, err := GetFont()
  33. if err != nil {
  34. return err
  35. }
  36. fc := freetype.NewContext() // xx
  37. fc.SetDPI(72) // dpi
  38. fc.SetFont(font) // 字体
  39. fc.SetFontSize(24) // 字体大小(磅)
  40. fc.SetClip(newImage.Bounds()) // 设置剪裁矩形以进行绘制
  41. fc.SetDst(newImage) // 设置目标图像(字体加在哪里)
  42. //fc.SetSrc(image.Black) // 字体颜色
  43. // 可根据 RGBA 设置颜色
  44. fc.SetSrc(image.NewUniform(color.RGBA{R: 255, G: 0, B: 0, A: 255}))
  45. text := "截图时间:" + time.Now().Format("2006-01-02 15:04:05")
  46. // 字体水印位置:在水印位置的基础上 偏移 Y 轴 380 * 24
  47. fontPt := freetype.Pt(origin.Bounds().Max.X-400, 24)
  48. if _, err = fc.DrawString(text, fontPt); err != nil {
  49. return err
  50. }
  51. // 创建水印文件
  52. created, err := os.Create(path)
  53. if err != nil {
  54. return err
  55. }
  56. defer created.Close()
  57. // 写入
  58. if err = jpeg.Encode(created, newImage, &jpeg.Options{Quality: 80}); err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. // 添加水印
  64. func AddTaxErrInfo(path string) error {
  65. f, err := os.Open(path)
  66. if err != nil {
  67. return err
  68. }
  69. defer f.Close()
  70. origin, err := png.Decode(f)
  71. if err != nil {
  72. return err
  73. }
  74. // 新建一个画布,把原图、水印、文字叠加上去
  75. newImage := image.NewRGBA(origin.Bounds())
  76. // 叠加原图
  77. draw.Draw(newImage, origin.Bounds(), origin, image.Point{}, draw.Over)
  78. // 加载字体
  79. font, err := GetFont()
  80. if err != nil {
  81. return err
  82. }
  83. fc := freetype.NewContext() // xx
  84. fc.SetDPI(72) // dpi
  85. fc.SetFont(font) // 字体
  86. fc.SetFontSize(24) // 字体大小(磅)
  87. fc.SetClip(newImage.Bounds()) // 设置剪裁矩形以进行绘制
  88. fc.SetDst(newImage) // 设置目标图像(字体加在哪里)
  89. //fc.SetSrc(image.Black) // 字体颜色
  90. // 可根据 RGBA 设置颜色
  91. fc.SetSrc(image.NewUniform(color.RGBA{R: 255, G: 0, B: 0, A: 255}))
  92. text := "截图时间:" + time.Now().Format("2006-01-02 15:04:05")
  93. // 字体水印位置:在水印位置的基础上 偏移 Y 轴 380 * 24
  94. fontPt := freetype.Pt(origin.Bounds().Max.X-400, 24)
  95. if _, err = fc.DrawString(text, fontPt); err != nil {
  96. return err
  97. }
  98. fontPt2 := freetype.Pt(origin.Bounds().Dx()/2-130, origin.Bounds().Dy()/2)
  99. text2 := "税局页面卡顿,加载失败!"
  100. if _, err = fc.DrawString(text2, fontPt2); err != nil {
  101. return err
  102. }
  103. // 创建水印文件
  104. created, err := os.Create(path)
  105. if err != nil {
  106. return err
  107. }
  108. defer created.Close()
  109. // 写入
  110. if err = jpeg.Encode(created, newImage, &jpeg.Options{Quality: 80}); err != nil {
  111. return err
  112. }
  113. return nil
  114. }
  115. // GetFont 获取字体
  116. func GetFont() (*truetype.Font, error) {
  117. return freetype.ParseFont(ttfBytes)
  118. }