go-chart go后端生成图表base64

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 @ 2020-10-28 15:53  zipon  阅读(348)  评论(0编辑  收藏  举报