我正在尝试在Django中发送一个JSON响应,其中包含来自python的matplotlib的.png图形的base64字符串表示以及有关它的一些文本信息。我在尝试将图像转换为base64字符串时遇到了一些问题:
# Initialize objects imma need
img_buffer = StringIO.StringIO()
out = StringIO.StringIO()
canvas = FigureCanvasAgg(fig)
# Print and convert
canvas.print_png(img_buffer)
base64.encode(img_buffer, out)
img_str = out.getvalue()
# Make dictionary
logger.info(img_str)
resp_d = {'image': img_str, 'nodes': str(pxs)}
return HttpResponse(json.dumps(resp_d), content_type='application/json')
注意:fig是我的matplotlib图(),我已经将它直接打印到响应并显示,所以我知道它正在被正确创建。
不幸的是,我没有得到图像,记录器显示img_str为空。我四处寻找并尝试了一些东西,包括使用fig.savefig(img_buffer)而不是canvas.print_png(img_buffer),但没有取得任何成功。我完全难过......任何想法可能会发生什么?非常感谢!
答案 0 :(得分:1)
问题是
canvas.print_png(img_buffer)
将文件指针留在“文件”的末尾,因此img_buffer.read()
返回一个空字符串。您可以在致电img_buffer.seek(0)
后立即致电canvas.print_png(img_buffer)
,但事实上,您的out
变量不是必需的。相反,替换它:
base64.encode(img_buffer, out)
img_str = out.getvalue()
使用:
img_str = base64.encodestring(img_buffer.getvalue())
或者,由于base64.encodestring是旧版界面的一部分,因此最好使用:
img_str = base64.b64encode(s.getvalue())