尝试创建带图片的JSON响应时StringIO问题
我正在尝试在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的Figure()
对象,我已经直接把它打印到响应中,并且显示正常,所以我知道它是正确生成的。
不幸的是,我没有得到图像,日志显示img_str是空的。我到处查找并尝试了几种方法,包括用fig.savefig(img_buffer)
替代canvas.print_png(img_buffer)
,但都没有成功。我完全搞不懂了……有没有人知道可能发生了什么?非常感谢!
1 个回答
1
问题是
canvas.print_png(img_buffer)
文件指针停留在“文件”的末尾,所以 img_buffer.read()
返回的是一个空字符串。你可以在调用 canvas.print_png(img_buffer)
之后立刻调用 img_buffer.seek(0)
,但实际上,你的 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())