在图像上的动态文本

huangapple go评论104阅读模式
英文:

Dynamic text on image

问题

我有一个应用程序,它创建一个动态图像并在上面写入文本。
英文文本按预期工作,但其他语言完全失败。字母变成方框等。
有什么建议如何解决这个问题吗?

英文:

I have an application that creates a dynamic image and writes text on it.
The English language text works as advertised but other languages fail completely. The letters become boxes, etc.

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "image"
  6. "image/color"
  7. "image/png"
  8. "math"
  9. "os"
  10. "github.com/fogleman/gg"
  11. guuid "github.com/google/uuid"
  12. "github.com/jimlawless/whereami"
  13. )
  14. type TextImage struct {
  15. BgImgPath string
  16. FontPath string
  17. FontSize float64
  18. Text string
  19. }
  20. var sentence = make(map[string]string)
  21. var language string
  22. func init() {
  23. sentence["arabic"] = "قفز الثعلب البني فوق الكلب الكسول."
  24. sentence["english"] = "The brown fox jumped over the lazy dog."
  25. sentence["hebrew"] = "השועל החום קפץ מעל הכלב העצלן."
  26. sentence["hindi"] = "भूरी लोमड़ी आलसी कुत्ते के ऊपर से कूद गई।."
  27. sentence["greek"] = &quot καφέ αλεπού πήδηξε πάνω από το τεμπέλικο σκυλί."
  28. }
  29. func main() {
  30. language = "greek"
  31. uuid := genUUID()
  32. createFolder(uuid)
  33. createImage(len(sentence[language]), uuid)
  34. writeImage(sentence[language], uuid)
  35. }
  36. func genUUID() string {
  37. return guuid.New().String()
  38. }
  39. func createFolder(p string) {
  40. path := "./tmp/" + p
  41. if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
  42. err := os.MkdirAll(path, os.ModePerm)
  43. if err != nil {
  44. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  45. }
  46. }
  47. }
  48. func writeImage(text string, path string) {
  49. ti := TextImage{
  50. BgImgPath: "./tmp/" + path + "/" + language + ".png",
  51. FontPath: "./ttf/PlayfairDisplay-Regular.ttf",
  52. FontSize: 24,
  53. Text: text,
  54. }
  55. img, err := textOnImg(ti)
  56. if err != nil {
  57. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  58. }
  59. err = saveImage(img, "./tmp/"+path+"/"+language+".png")
  60. if err != nil {
  61. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  62. }
  63. }
  64. func createImage(textlength int, path string) {
  65. minDim := 300
  66. scale := 30
  67. dim := math.Sqrt(float64(textlength))
  68. width := int(dim) * scale
  69. height := int(dim) * scale
  70. if width < minDim || height < minDim {
  71. width = minDim
  72. height = minDim
  73. }
  74. upLeft := image.Point{0, 0}
  75. lowRight := image.Point{width, height}
  76. img := image.NewRGBA(image.Rectangle{upLeft, lowRight})
  77. //img.Bounds()
  78. white := color.RGBA{255, 255, 255, 0xff}
  79. // Set color for each pixel.
  80. for x := 0; x < width; x++ {
  81. for y := 0; y < height; y++ {
  82. switch {
  83. case x < width/2 && y < height/2: // upper left quadrant
  84. img.Set(x, y, white)
  85. case x >= width/2 && y >= height/2: // lower right quadrant
  86. img.Set(x, y, color.White)
  87. default:
  88. img.Set(x, y, color.White)
  89. }
  90. }
  91. }
  92. f, err := os.Create("./tmp/" + path + "/" + language + ".png")
  93. if err != nil {
  94. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  95. }
  96. err = png.Encode(f, img)
  97. if err != nil {
  98. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  99. }
  100. }
  101. func deleteFolder(folder string) {
  102. err := os.RemoveAll("./tmp/" + folder)
  103. if err != nil {
  104. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  105. }
  106. }
  107. func textOnImg(ti TextImage) (image.Image, error) {
  108. bgImage, err := gg.LoadImage(ti.BgImgPath)
  109. if err != nil {
  110. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  111. return nil, err
  112. }
  113. imgWidth := bgImage.Bounds().Dx()
  114. imgHeight := bgImage.Bounds().Dy()
  115. dc := gg.NewContext(imgWidth, imgHeight)
  116. dc.DrawImage(bgImage, 0, 0)
  117. if err := dc.LoadFontFace(ti.FontPath, ti.FontSize); err != nil {
  118. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  119. return nil, err
  120. }
  121. x := float64(imgWidth / 2)
  122. y := float64((imgHeight / 2) - 80)
  123. maxWidth := float64(imgWidth) - 60.0
  124. dc.SetColor(color.Black)
  125. fmt.Println(ti.Text)
  126. dc.DrawStringWrapped(ti.Text, x, y, 0.5, 0.5, maxWidth, 1.5, gg.AlignLeft)
  127. return dc.Image(), nil
  128. }
  129. func saveImage(img image.Image, path string) error {
  130. if err := gg.SavePNG(path, img); err != nil {
  131. fmt.Println(err.Error() + " @ " + whereami.WhereAmI())
  132. return err
  133. }
  134. return nil
  135. }

Any recommendations how to fix this?

答案1

得分: 2

我更改了一行代码(如@dmitry建议的),并使其在Windows上工作:

  1. FontPath: "C:/Windows/Fonts/arial.ttf",

顺便说一句,你可以使用映射字面量代替init()调用。

  1. var sentence = map[string]string{
  2. "arabic": "قفز الثعلب البني فوق الكلب الكسول.",
  3. "english": "The brown fox jumped over the lazy dog.",
  4. "hebrew": "השועל החום קפץ מעל הכלב העצלן.",
  5. "hindi": "भूरी लोमड़ी आलसी कुत्ते के ऊपर से कूद गई।",
  6. "greek": "Η καφέ αλεπού πήδηξε πάνω από το τεμπέλικο σκυλί.",
  7. }
英文:

I changed one line (as @dmitry suggested) and got it to work (Windows):

  1. FontPath: "C:/Windows/Fonts/arial.ttf",

BTW you can use a map literal instead of the init() call.

  1. var sentence = map[string]string{
  2. "arabic": "قفز الثعلب البني فوق الكلب الكسول.",
  3. "english": "The brown fox jumped over the lazy dog.",
  4. "hebrew": "השועל החום קפץ מעל הכלב העצלן.",
  5. "hindi": "भूरी लोमड़ी आलसी कुत्ते के ऊपर से कूद गई।.",
  6. "greek": &quot καφέ αλεπού πήδηξε πάνω από το τεμπέλικο σκυλί.",
  7. }

huangapple
  • 本文由 发表于 2022年5月31日 06:29:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/72440589.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定