内存中生成的图像未显示在龙卷风 Web 服务器中

In-memory generated image is not displayed in tornado web server

我尝试使用该代码生成图像,并将其存储在 tornado 网络服务器的模板回复中

python3 代码看起来像这样

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>

页面呈现良好。段落文本实际上 test.jpeg 但未加载图像。我将如何从内存中正确生成和回复图像? 版本 Python 3.6.5,使用 Tornado 5.0.2

此解决方案应该适合您:

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 相对于我启动 tornado websocket 服务器的目录。此解决方案现在生成图像,而不是从磁盘加载一些图像并通过 GET 将其发送到客户端。

我得到的输出:

希望对您有所帮助!