尝试创建带图片的JSON响应时StringIO问题

0 投票
1 回答
1907 浏览
提问于 2025-04-17 17:00

我正在尝试在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())

撰写回答