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

Popular posts from this blog

Line ending issue with Mercurial or Visual Studio -

java - Jtable duplicate Rows -

java - Run a .jar on Heroku -