0

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

4

1 回答 1

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())
于 2013-02-25T03:52:44.707 回答