我想做的是让我的 Pylons 应用程序根据某些数据动态生成图像,并以可以在浏览器中查看的方式返回它。
到目前为止,我正在生成这样的图像:
import Image, ImageDraw
image = Image.new("RGB", (width, height),"black")
img_out = ImageDraw.Draw(image)
img_out.polygon(...
img_out.text(...
#etc
图像已成功生成,甚至可以保存到文件中,如下所示:
img_out.save(filepath)
我的问题是我没有尝试将其写入磁盘,而是通过 Pylons 响应返回它。基于another question的答案我能够走到这一步:
import FileApp
my_headers = [('Content-Disposition', 'attachment; filename=\"' + user_filename + '\"'), ('Content-Type', 'text/plain')]
file_app = FileApp(filepath, headers=my_headers)
return file_app(request.environ, self.start_reponse)
使用这个解决方案,我可以获取保存在服务器端的 png 并将其返回给用户下载。不过,这里仍然存在两个问题。首先,我被迫将文件写入磁盘,然后从磁盘提供服务,而不是简单地直接使用代码中的图像。第二个是它实际上返回文件,因此用户被迫下载它而不是在浏览器中查看它。
我想要的是用户能够在浏览器中查看文件,而不是自己下载。理想情况下,我也不必将图像保存到服务器端的磁盘上,但我意识到如果它不存在于服务器或客户端计算机上,就不可能提供它。
所以我的问题是这样的。我可以直接从代码提供图像,以便用户只需在浏览器中看到图像作为对其请求的响应吗?如果没有,我可以将图像保存到磁盘服务器端并从那里提供服务,以便用户将在浏览器中看到图像而不提示下载文件吗?
(就其值(value)而言,我使用的是 Python 2.6.2 和 PasteScript 1.7.4.2)
最佳答案
浏览器可以接受原始数据作为 src
的一部分img
的属性的base64编码...
from PIL import Image
from cStringIO import StringIO
a = Image.new('RGB', (10, 10), 'black')
# ...
buf = StringIO()
a.save(buf, 'png')
b64img = '<img src="data:image/png;base64,{0}" />'.format(buf.getvalue().encode('base64'))
因此,您在这里要做的就是构建图像,将其保存到内存中的字符串缓冲区(而不是磁盘上),然后将其编码为 base64...您返回 <img>
使用任何模板/等将标签作为页面的一部分(或者如果懒的话就纯粹是其本身)...也许只是一个 return Response(b64img)
会做的...
关于python - 从 Pylons 返回动态 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776600/