内存中生成的图像未显示在龙卷风 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 将其发送到客户端。
我得到的输出:
希望对您有所帮助!
我尝试使用该代码生成图像,并将其存储在 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 将其发送到客户端。
我得到的输出:
希望对您有所帮助!