在Python / Web中提供动态图像的正确方法。使用PIL

时间:2013-02-19 12:33:01

标签: python image dynamic python-imaging-library web.py

我需要让Python文件充当图像。即,Python文件的路径将在网页的标记内使用。 Python文件将使用PIL动态创建图像(没有中间保存到文件)。

我正在使用Python 2.7,Web.Py,& PIL,在32位Windows XP上开发,使用WAMPSS Web服务器,并使用最新的Chrome。

几乎那里。我想。

这是我的python图像文件的缩减示例:

#!/home/bin/python
# #############################################################################
import web, sys
from PIL import Image, ImageDraw, ImageFont
# #############################################################################
class debug:
    def GET(self):
        # drawing with PIL (Python Image Library)
        # create a new 256x256 pixel image surface (default is black bg)
        img = Image.new("RGB", (256, 256))
        # set up the new image surface for drawing
        draw = ImageDraw.Draw (img)
        # REMOVED - Image manipulation
        # Output the image to the browser
        sys.stdout.write('Status: 200 OK\r\n')
        sys.stdout.write('Content-type: image/png\r\n')
        sys.stdout.write('\r\n')
        img.save(sys.stdout, "PNG")
# #############################################################################
urls = ( '/debug.py', 'debug' )
app = web.application(urls, globals())
if __name__ == "__main__":
    app.run()
# #############################################################################

现在,这有效......有点。

如果我直接在浏览器(本地AMPSS服务器)中查看此文件,则会显示该图像。但是,与类似的1k PNG图像相比,显示/服务器(5秒以上)需要很长时间。 Chrome控制台说它失败了(虽然我可以看到图片)

我认为浏览器期待其他我不发送的内容?

当我在JQuery和OnLoad事件中使用此图像时,实际出现了问题。事情变得......奇怪......因为缺少一个更好的词。我似乎有一些事件(不是我的)火,它会在加载后几秒钟清除图像。显示。

Chrome控制台说在检索图像时GET失败了(虽然它确实显示了图像,至少在JS中的某些东西再次消失之前!)

有趣的是,这个问题似乎没有出现在最新的Firefox中。 加载时间在最新的Opera中被夸大了,但JS并没有出现故障。在IE8中也一样

为了让事情更加混乱,我有两台Windows XP(32位)开发机器。 JS故障不会发生在其中一个上面。 Chrome控制台不会列出任何错误!

我在网上对图像文件进行了演示:LINKY 我在开发页面中使用此文件:LINKY 如果您点击白色图像持有者,Jquery / JS将激活。

我不知道这是否适用于您的设置。我只是为了完整而链接到这里。

关于我缺少的任何想法?

1 个答案:

答案 0 :(得分:2)

在web.py中,您应该返回必须发送到浏览器的内容。也可以使用web.header设置HTTP标头。

将图片保存到StringIO并返回其内容:

import StringIO

# in GET(self):
web.header('Content-type', 'image/png')
buf = StringIO.StringIO()
img.save(buf, "PNG")
contents = buf.getvalue()
return contents