尝试使用image创建JSON响应时出现StringIO问题

时间:2013-02-25 03:26:09

标签: python django json matplotlib

我正在尝试在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),但没有取得任何成功。我完全难过......任何想法可能会发生什么?非常感谢!

1 个答案:

答案 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())