代码之家  ›  专栏  ›  技术社区  ›  user3732793

内存中生成的图像不会显示在tornado web服务器中

  •  1
  • user3732793  · 技术社区  · 7 年前

    使用该代码,我尝试生成一个图像,并将其存储在tornado webserver的模板回复中

    import io
    from PIL import Image, ImageDraw
    import tornado.ioloop
    import tornado.web
    
    class ImageHandler(tornado.web.RequestHandler):
        def get(self, filename):
            #open image
            f = Image.open('img/' + filename)
    
            #generate Image
            image = Image.new("RGB", (300, 50))
            draw = ImageDraw.Draw(image)
            draw.text((0, 0), "create_images ")
            o = io.BytesIO()
            image.save(o, 'JPEG')
    
            #store image in reply
            o.seek(0)
            f.save(o, format="JPEG")
            s = o.getvalue()
            self.set_header('Content-type', 'image/jpg')
            self.set_header('Content-length', len(s))
            self.write(s)
    
    
    class PageHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('image.html', filename='test.jpg')
    
    class Application(tornado.web.Application):
        def __init__(self):
            handlers=[
                (r'/', PageHandler),
                (r'/img/(?P<filename>.+\.jpg)?', ImageHandler),
            ]
            tornado.web.Application.__init__(self, handlers)
    
    if __name__ == "__main__":
        app = Application()
        port = 8080
        print('start server at port ' + str(port))
        app.listen(port)
        tornado.ioloop.IOLoop.current().start()
    

    image.html看起来像

    <html>
       <body>
         <p>{{ escape(filename) }}</p>
         <img src="/img/{{ escape(filename) }}" style="width:50px;height:50px;"/>
       </body>
     </html>
    

    A页面呈现良好。段落文本存储实际上是test.jpeg,但图像未加载。如何正确生成和回复内存中的图像?

    1 回复  |  直到 7 年前
        1
  •  2
  •   tahesse    7 年前

    此解决方案应适用于您:

    import io
    from PIL import Image, ImageDraw
    import tornado.ioloop
    import tornado.web
    
    class ImageHandler(tornado.web.RequestHandler):
        def get(self, filename):
            # create buffer
            o = io.BytesIO()
    
            #generate Image
            img = Image.new('RGB', (100, 30), color = (73, 109, 137))
            d = ImageDraw.Draw(img)
            d.text((10,10), "Hello world", fill=(255, 255, 0))
            o.seek(0)
            img.save(o, format="JPEG")
    
            #store image in reply
            s = o.getvalue()
            print(s)
            self.set_header('Content-type', 'image/jpeg')
            self.set_header('Content-length', len(s))
            self.write(s)
    
    
    class PageHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('image.html', filename='test.jpg')
    
    class Application(tornado.web.Application):
        def __init__(self):
            handlers=[
                (r'/', PageHandler),
                (r'/img/(?P<filename>.+\.jpg)?', ImageHandler),
            ]
            tornado.web.Application.__init__(self, handlers)
    
    if __name__ == "__main__":
        app = Application()
        port = 8080
        print('start server at port ' + str(port))
        app.listen(port)
        tornado.ioloop.IOLoop.current().start()
    

    我最终的错误是:没有 img/test.jpg

    我得到的输出:

    enter image description here

    希望这有帮助!