123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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
- }
- }
|