package produce import ( "bytes" "fmt" "image/png" "os" "github.com/fogleman/gg" ) type imageInfo struct { dc *gg.Context } func (*imageInfo) Runimage(s string) ([]byte, error) { // 创建一个新的gg.Context实例,根据字符串长度动态设置图像大小 const padding = 20 // 上下留白 const charWidth = 10 // 字符宽度 const lineHeight = 15 // 行高 const maxWidth = 800 // 最大宽度 // 计算图像高度和行数 lines := 0 width := 0.0 height := padding * 2 lineWidth := 0.0 dc := gg.NewContext(1, 1) //加载字体和字体大小 if err := dc.LoadFontFace("../assets/SimHei.ttf", 12); err != nil { fmt.Println(err.Error()) return nil, nil } //计算图像高度和行数 for _, r := range s { w, _ := dc.MeasureString(string(r)) if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) { lines++ if lineWidth > width { width = lineWidth } lineWidth = 0.0 } lineWidth += w } lines++ if lineWidth > width { width = lineWidth } height += (lines) * lineHeight dc = gg.NewContext(int(width+float64(padding*2)), int(height)) dc.SetRGB(0, 0, 0) dc.Clear() dc.SetRGB(1, 1, 1) // 绘制字符串 x := padding y := padding lineWidth = 0.0 for _, r := range s { w, _ := dc.MeasureString(string(r)) if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) { y += lineHeight lineWidth = 0.0 if r == '\n' { continue } } dc.DrawString(string(r), float64(x)+lineWidth, float64(y)) lineWidth += w } // 将图像编码为PNG格式的二进制数据 var buf bytes.Buffer if err := png.Encode(&buf, dc.Image()); err != nil { return nil, nil } //SaveImage(dc, "") return buf.Bytes(), nil } func (im *imageInfo) SaveImage(fileName string) { // 保存图片 name := "../file/test_pic_1.png" newfile, err := os.Create(name) if err != nil { fmt.Println(err.Error()) return } defer newfile.Close() // 将文件保存输出,并设置压缩比 //err = jpeg.Encode(newfile, dc.Image(), &jpeg.Options{Quality: 150}) err = png.Encode(newfile, im.dc.Image()) if err != nil { fmt.Println(err.Error()) return } }