python - How to send a pygame image over websockets? -
i'm trying code let websites view webcam. i'm following tutorial linked on this website, except using python , pygame instead of processing.
at moment, code grabbing pygame image (which simplecv image), attempting convert jpg format, , send on websockets client display inside img
tag. however, can't seem figure out how convert pygame image jpg , display on web browser.
this code server, uses flask , gevent:
#!/usr/bin/env python import base64 import cstringio import time geventwebsocket.handler import websockethandler gevent.pywsgi import wsgiserver flask import flask, request, render_template import pygame pygame.init() import simplecv scv app = flask(__name__) cam = scv.camera(0) @app.route('/') def index(): return render_template('index.html') @app.route('/camera') def camera(): if request.environ.get('wsgi.websocket'): ws = request.environ['wsgi.websocket'] while true: image = cam.getimage().fliphorizontal().getpgsurface() data = cstringio.stringio() pygame.image.save(image, data) ws.send(base64.b64encode(data.getvalue())) time.sleep(0.5) if __name__ == '__main__': http_server = wsgiserver(('',5000), app, handler_class=websockethandler) http_server.serve_forever()
this html file:
<!doctype html> <html> <head> <title>flask/gevent websocket test</title> <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> <script type="text/javascript" charset="utf-8"> $(document).ready(function(){ if ("websocket" in window) { cam = new websocket("ws://" + document.domain + ":5000/camera"); cam.onmessage = function (msg) { $("#cam").attr('src', 'data:image/jpg;base64,' + msg.data); }; cam.onerror = function(e) { console.log(e); } } else { alert("websocket not supported"); } }); </script> </head> <body> <img id="cam" src="" width="640" height="480" /> </body> </html>
these specific lines think i'm having trouble with:
while true: image = cam.getimage().fliphorizontal().getpgsurface() data = cstringio.stringio() pygame.image.save(image, data) ws.send(base64.b64encode(data.getvalue())) time.sleep(0.5)
currently, if try , run code, going localhost:5000
display invalid jpg image. becomes laggy if try running on firefox, may unrelated issue can debug later.
i've checked , made sure pygame image valid one, since i'm converting library, , checked using websockets correctly sending text data , forth.
i've tried calling pygame.image.to_string
try , convert pygame surface rgb format, doesn't work.
what doing wrong?
using underlying pil image, can write file-like object, read , base-64 encode it:
from geventwebsocket.handler import websockethandler gevent.pywsgi import wsgiserver flask import flask, request time import sleep cstringio import stringio import pygame pygame.init() import simplecv scv app = flask(__name__) cam = scv.camera(0) @app.route('/camera') def camera(): if request.environ.get('wsgi.websocket'): ws = request.environ['wsgi.websocket'] while true: fp = stringio() image = cam.getimage().fliphorizontal().getpil() image.save(fp, 'jpeg') ws.send(fp.getvalue().encode("base64")) #fp.close() << benchmark , memory tests needed sleep(0.5) if __name__ == '__main__': http_server = wsgiserver(('',5000), app, handler_class=websockethandler) http_server.serve_forever()
Comments
Post a Comment