python - 从 Pylons 返回动态 png

标签 python image png pylons

我想做的是让我的 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/

相关文章:

python - 基于标签的重叠聚类(软聚类)

javascript - 用同一网址上的新图片刷新图片

javascript - NodeJS highchart 保存 png

java - 如何使用像素 RGB 值 0 到 1 在 java 中编写 PNG 文件?

c# - png over jpeg(水印效果)质量差?

python - 如何优雅地捕获错误并保持方法清洁?

python - 删除 pandas 中具有特定日期的行

基于另一个参数将参数添加到 argparse 的 Pythonic 方法

image - 代码不适用于 matlab 中的图像处理

java - 在单个图像中检测多个图像