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)
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:8888与localhost:8888/img将显示的图像。