From 8dc5e249d54a86455dd4c9df1a5eb7e4b59bc7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Wed, 2 Jan 2013 18:24:56 +0100 Subject: [PATCH] Stream image directly from memory instead of buffering to disk --- printer_webui/server.py | 11 +++++++---- printer_webui/webcam.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/printer_webui/server.py b/printer_webui/server.py index 242e9a13..b8c36955 100644 --- a/printer_webui/server.py +++ b/printer_webui/server.py @@ -2,7 +2,7 @@ __author__ = "Gina Häußge " __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' -from flask import Flask, request, render_template, jsonify, send_from_directory, abort +from flask import Flask, request, render_template, jsonify, send_file, abort from werkzeug import secure_filename from printer_webui.printer import Printer, getConnectionOptions @@ -12,6 +12,7 @@ from printer_webui.webcam import hasWebcamSupport, Webcam import sys import os import fnmatch +import StringIO BASEURL="/ajax/" SUCCESS={} @@ -267,9 +268,11 @@ def getImage(): if webcam is None: abort(404) - filename = "current.jpg" - webcam.save(os.path.join(WEBCAM_FOLDER, filename)) - return send_from_directory(WEBCAM_FOLDER, filename) + image = webcam.get() + strIO = StringIO.StringIO() + image.save(strIO, "JPEG", quality=80) + strIO.seek(0) + return send_file(strIO, mimetype="image/jpeg") #~~ helper functions diff --git a/printer_webui/webcam.py b/printer_webui/webcam.py index b30a01fb..79a111ed 100644 --- a/printer_webui/webcam.py +++ b/printer_webui/webcam.py @@ -13,6 +13,8 @@ try: except: win32vidcap = None +import PIL + def hasWebcamSupport(): if cv == None and win32vidcap == None: return False @@ -30,6 +32,20 @@ class Webcam(object): except: pass + def get(self): + if self._cam is None: + return None + + if cv is not None: + frame = cv.QueryFrame(self._cam) + image = PIL.Image.fromstring("L", frame.GetSize(), frame.tostring()) + return image + elif win32vidcap is not None: + image = self._cam.getImage() + return image + else: + return None + def save(self, filename): if self._cam is None: return