go-chart go后端生成图表base64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import ("github.com/golang/freetype/truetype"<br>"github.com/wcharczuk/go-chart"<br>"github.com/wcharczuk/go-chart/drawing")<br><br>const imgStrPrefix = "data:image/png;base64,"
 
func imgToStr(imgContent bytes.Buffer) string {
    return imgStrPrefix + base64.StdEncoding.EncodeToString(imgContent.Bytes())
}
 
func loadTTF(filename string) (ttf *truetype.Font, err error) {
    ttfContent, err := ioutil.ReadFile(app.Cfg.Templatesdir + filename)
    if err != nil {
        return ttf, err
    }
    ttf, err = truetype.Parse(ttfContent)
    return
}
 
func ToBarChart(title string, data interface{}, xkey string, ykey string, ymin float64, ymax float64, isReverse bool) template.HTML {
    values := make([]chart.Value, 0)
    items, isSucc := data.([]map[string]interface{})
    if !isSucc {
        logger.Errorf("传入数据不符合格式")
        return ""
    }
    if isReverse {
        for i := len(items) - 1; i >= 0; i-- {
            cValueTmp := chart.Value{
                Value: items[i][ykey].(float64),
                Label: items[i][xkey].(string),
            }
            values = append(values, cValueTmp)
        }
    } else {
        for _, item := range items {
            cValueTmp := chart.Value{
                Value: item[ykey].(float64),
                Label: item[xkey].(string),
            }
            values = append(values, cValueTmp)
        }
    }
 
    ttf, err := loadTTF("MSYH.TTF")
    if err != nil {
        logger.Warnf("加载字体失败:%v", err)
    }
    yrange := chart.ContinuousRange{
        Min: ymin,
        Max: ymax,
    }
    graph := chart.BarChart{
        Font:  ttf,
        Title: title,
        TitleStyle: chart.Style{
            Show:                true,
            TextHorizontalAlign: chart.TextHorizontalAlignCenter,
        },
        XAxis: chart.Style{
            Show:        true,
            StrokeWidth: 1,
        },
        YAxis: chart.YAxis{
            Name: "数量",
            Style: chart.Style{
                Show:        true,
                StrokeWidth: 1,
            },
            Range: &yrange,
            ValueFormatter: func(v interface{}) string {
                if vf, isFloat := v.(float64); isFloat {
                    vi := int64(vf)
                    return fmt.Sprintf("%d", vi)
                }
                return ""
            },
        },
        Canvas: chart.Style{
            Show: true,
            Padding: chart.Box{
                Top:   4,
                IsSet: true,
            },
            FillColor: drawing.Color{120, 9, 9, 9},
        },
        Background: chart.Style{
            Padding: chart.Box{
                Top: 40,
            },
        },
        Height:   512,
        BarWidth: 60,
 
        Bars: values,
    }
 
    //buffer := bytes.NewBuffer([]byte{})
    var buffer bytes.Buffer
    //f,err := os.Create("chart.png")
    err = graph.Render(chart.PNG, &buffer)
    if err != nil {
        logger.Errorf("图表渲染错误:%v", err)
    }
    base64str := imgToStr(buffer)
    return template.HTML(fmt.Sprintf("<img src='%s' />", base64str))
}

  

 
posted @   zipon  阅读(503)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示