在没有文件 I/O 的情况下使用 Tornado 提供图像

Art*_*Grc 2 python webcam tornado python-2.7 raspberry-pi

我正在尝试使用 Tornado 库提供网络摄像头图像,但我发现的唯一方法是先保存图像,然后返回图像名称。

有没有办法在不保存到磁盘的情况下提供图像?

import tornado.ioloop
import tornado.web
import pygame.camera
import pygame.image
from time import time
from io import StringIO

pygame.camera.init()
cam = pygame.camera.Camera(pygame.camera.list_cameras()[0])
cam.start()

class MainHandler(tornado.web.RequestHandler):
    def get(self):


        img = cam.get_image()
        name = str( round( time() ) )
        name = name + '.jpg'
        pygame.image.save(img, name)


        self.write('<img src="' + name + '">')



application = tornado.web.Application([
    (r"/", MainHandler),
    (r'/(.*)', tornado.web.StaticFileHandler, {'path': ''})
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

dan*_*ano 5

pygame 似乎不支持将图像保存到类似文件的对象,因此您将无法直接使用它。不过,它确实有tostring方法。该文档指出它允许与其他图像库的互操作性:

创建可以使用其他 Python 映像包中的“fromstring”方法传输的字符串

因此,您可以使用tostring将图像转换为字符串,然后使用另一个支持将图像写入类文件对象的 Python 库,并使用其fromstring方法,

这是一个pillow用作替代图像库的示例。

import tornado.ioloop
import tornado.web
from PIL import Image
import cStringIO as StringIO

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("<img src='http://localhost:8888/img'>")

class ImgHandler(tornado.web.RequestHandler):
    img_name = "bg.jpg"
    img = pygame.image.load(img_name)
    str_img = pygame.image.tostring(img, "RGB")
    size = img.get_size()
    fimg = Image.frombytes("RGB", size, str_img, "raw")
    fobj = StringIO.StringIO()
    fimg.save(fobj, format="png")  #jpeg encoder isn't available in my install...
    for line in fobj.getvalue():
        self.write(line)
    self.set_header("Content-type",  "image/png")


application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/img", ImgHandler),
    #(r'/(.*)', tornado.web.StaticFileHandler, {'path': ''})
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

localhost:8888localhost:8888/img将显示的图像。