2024-05-16 22:08:25 发布
网友
我正在django应用程序中使用matplotlib,希望直接返回渲染图像。 到目前为止,我可以去plt.savefig(...),然后返回图像的位置。
plt.savefig(...)
我想做的是:
return HttpResponse(plt.renderfig(...), mimetype="image/png")
有什么想法吗?
Django的HttpResponse对象支持类似文件的API,您可以将文件对象传递给savefig。
HttpResponse
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_png和savefig之间有区别,至少在我做的初始测试中是这样。调用fig.savefig(response, format='png')得到的图像较大,背景为白色,而原始的canvas.print_png(response)给出的图像稍小,背景为灰色。因此,我将用下面的几行替换上面的几行:
print_png
savefig
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
不过,您仍然需要实例化画布。
Django的
HttpResponse
对象支持类似文件的API,您可以将文件对象传递给savefig。因此,可以直接在
HttpResponse
中返回图像。那cStringIO呢?
在Matplotlib Cookbook中有一个食谱正是这样做的。其核心是:
把它放到你的视图文件中,指向它,你就可以运行了。
编辑:如前所述,这是食谱的简化版本。但是,看起来调用
print_png
和savefig
之间有区别,至少在我做的初始测试中是这样。调用fig.savefig(response, format='png')
得到的图像较大,背景为白色,而原始的canvas.print_png(response)
给出的图像稍小,背景为灰色。因此,我将用下面的几行替换上面的几行:不过,您仍然需要实例化画布。
相关问题 更多 >
编程相关推荐