一尘不染

使用python动态将matplotlib图像提供给网络

python

在这里以类似的方式提出了这个问题,但是答案却是我的头(我是python和Web开发的新手),所以我希望有一个更简单的方法,或者可以用不同的方式解释它。

我正在尝试使用matplotlib生成图像并将其提供服务,而无需先将文件写入服务器。我的代码可能有点傻,但是它像这样:

import cgi
import matplotlib.pyplot as pyplot
import cStringIO #I think I will need this but not sure how to use

...a bunch of matplotlib stuff happens....
pyplot.savefig('test.png')

print "Content-type: text/html\n"
print """<html><body>
...a bunch of text and html here...
<img src="test.png"></img>
...more text and html...
</body></html>
"""

我认为不应该执行pyplot.savefig(’test.png’),而是创建一个cstringIO对象,然后执行以下操作:

mybuffer=cStringIO.StringIO()
pyplot.savefig(mybuffer, format="png")

但是我从那里迷路了。我看到的所有示例(例如http://lost-
theory.org/python/dynamicimg.html)都涉及类似的操作

print "Content-type: image/png\n"

而且我不知道如何将其与我已经输出的HTML集成在一起。


阅读 158

收藏
2020-12-20

共1个答案

一尘不染

你应该

  • 首先写入cStringIO对象
  • 然后写HTTP头
  • 然后将cStringIO的内容写入stdout

因此,如果发生错误savefig,您仍然可以返回其他内容,甚至另一个标头。有些错误不会更早地识别出来,例如文本问题,图像尺寸太大等。

您需要告诉savefig将输出写入何处。你可以做:

format = "png"
sio = cStringIO.StringIO()
pyplot.savefig(sio, format=format)
print "Content-Type: image/%s\n" % format
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # Needed this on windows, IIS
sys.stdout.write(sio.getvalue())

如果要将图像嵌入HTML:

print "Content-Type: text/html\n"
print """<html><body>
...a bunch of text and html here...
<img src="data:image/png;base64,%s"/>
...more text and html...
</body></html>""" % sio.getvalue().encode("base64").strip()
2020-12-20