image.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package produce
  2. import (
  3. "bytes"
  4. "fmt"
  5. "image/png"
  6. "os"
  7. "github.com/fogleman/gg"
  8. )
  9. type imageInfo struct {
  10. dc *gg.Context
  11. }
  12. func (*imageInfo) Runimage(s string) ([]byte, error) {
  13. // 创建一个新的gg.Context实例,根据字符串长度动态设置图像大小
  14. const padding = 20 // 上下留白
  15. const charWidth = 10 // 字符宽度
  16. const lineHeight = 15 // 行高
  17. const maxWidth = 800 // 最大宽度
  18. // 计算图像高度和行数
  19. lines := 0
  20. width := 0.0
  21. height := padding * 2
  22. lineWidth := 0.0
  23. dc := gg.NewContext(1, 1)
  24. //加载字体和字体大小
  25. if err := dc.LoadFontFace("../assets/SimHei.ttf", 12); err != nil {
  26. fmt.Println(err.Error())
  27. return nil, nil
  28. }
  29. //计算图像高度和行数
  30. for _, r := range s {
  31. w, _ := dc.MeasureString(string(r))
  32. if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
  33. lines++
  34. if lineWidth > width {
  35. width = lineWidth
  36. }
  37. lineWidth = 0.0
  38. }
  39. lineWidth += w
  40. }
  41. lines++
  42. if lineWidth > width {
  43. width = lineWidth
  44. }
  45. height += (lines) * lineHeight
  46. dc = gg.NewContext(int(width+float64(padding*2)), int(height))
  47. dc.SetRGB(0, 0, 0)
  48. dc.Clear()
  49. dc.SetRGB(1, 1, 1)
  50. // 绘制字符串
  51. x := padding
  52. y := padding
  53. lineWidth = 0.0
  54. for _, r := range s {
  55. w, _ := dc.MeasureString(string(r))
  56. if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
  57. y += lineHeight
  58. lineWidth = 0.0
  59. if r == '\n' {
  60. continue
  61. }
  62. }
  63. dc.DrawString(string(r), float64(x)+lineWidth, float64(y))
  64. lineWidth += w
  65. }
  66. // 将图像编码为PNG格式的二进制数据
  67. var buf bytes.Buffer
  68. if err := png.Encode(&buf, dc.Image()); err != nil {
  69. return nil, nil
  70. }
  71. //SaveImage(dc, "")
  72. return buf.Bytes(), nil
  73. }
  74. func (im *imageInfo) SaveImage(fileName string) {
  75. // 保存图片
  76. name := "../file/test_pic_1.png"
  77. newfile, err := os.Create(name)
  78. if err != nil {
  79. fmt.Println(err.Error())
  80. return
  81. }
  82. defer newfile.Close()
  83. // 将文件保存输出,并设置压缩比
  84. //err = jpeg.Encode(newfile, dc.Image(), &jpeg.Options{Quality: 150})
  85. err = png.Encode(newfile, im.dc.Image())
  86. if err != nil {
  87. fmt.Println(err.Error())
  88. return
  89. }
  90. }