1

我想要做的是让我的 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 响应返回它。根据另一个问题的答案,我能够做到这一点:

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 并将其返回给用户以供下载。不过,这里有两个问题。首先是我被迫将文件写入磁盘,然后从磁盘提供它,而不是直接使用代码中的图像。第二个是它实际上是在返回文件,因此用户被迫下载它而不是在浏览器中查看它。

我想要的是让用户能够在他们的浏览器中查看文件,而不是自己下载。理想情况下,我也不必将图像保存到服务器端的磁盘上,但我意识到如果没有它存在于服务器或客户端的计算机上,它可能无法提供它。

所以我的问题是这个。我可以直接从代码中提供图像,以便用户在浏览器中简单地看到图像作为对他们请求的响应吗?如果没有,我可以将图像保存到磁盘服务器端并从那里提供它,以便用户将在他们的浏览器中看到图像并且不会被提示下载文件?

(值得我使用 Python 2.6.2 和 PasteScript 1.7.4.2)

4

1 回答 1

1

浏览器可以接受原始数据作为base64 编码src属性的一部分img...

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)会做......

于 2013-07-21T20:41:29.080 回答