将Matplotlib图像作为字符串返回

2024-05-16 22:08:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在django应用程序中使用matplotlib,希望直接返回渲染图像。 到目前为止,我可以去plt.savefig(...),然后返回图像的位置。

我想做的是:

return HttpResponse(plt.renderfig(...), mimetype="image/png")

有什么想法吗?


Tags: django图像image应用程序returnpngmatplotlibplt
3条回答

Django的HttpResponse对象支持类似文件的API,您可以将文件对象传递给savefig。

response = HttpResponse(mimetype="image/png")
# create your image as usual, e.g. pylab.plot(...)
pylab.savefig(response, format="png")
return response

因此,可以直接在HttpResponse中返回图像。

cStringIO呢?

import pylab
import cStringIO
pylab.plot([3,7,2,1])
output = cStringIO.StringIO()
pylab.savefig('test.png', dpi=75)
pylab.savefig(output, dpi=75)
print output.getvalue() == open('test.png', 'rb').read() # True

Matplotlib Cookbook中有一个食谱正是这样做的。其核心是:

def simple(request):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig=Figure()
    ax=fig.add_subplot(111)
    ax.plot(range(10), range(10), '-')
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response

把它放到你的视图文件中,指向它,你就可以运行了。

编辑:如前所述,这是食谱的简化版本。但是,看起来调用print_pngsavefig之间有区别,至少在我做的初始测试中是这样。调用fig.savefig(response, format='png')得到的图像较大,背景为白色,而原始的canvas.print_png(response)给出的图像稍小,背景为灰色。因此,我将用下面的几行替换上面的几行:

    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    fig.savefig(response, format='png')
    return response

不过,您仍然需要实例化画布。

相关问题 更多 >