Python屏幕捕获错误

时间:2016-10-15 15:07:12

标签: python image flask

我正在尝试修改用于屏幕流的here代码。在上面的教程中,它是用于从磁盘读取图像,而我正在尝试截取屏幕截图。我收到此错误。

  

断言isinstance(数据,字节),'应用程序必须写入字节'   AssertionError:应用程序必须写入字节

我应该做些什么改变呢?

这是我迄今为止所做的 -

<br>index.html<br>
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h1>Video Streaming Demonstration</h1>
    <img src="{{ url_for('video_feed') }}">
  </body>
</html>


app.py

#!/usr/bin/env python
from flask import Flask, render_template, Response
import time
# emulated camera
from camera import Camera

# Raspberry Pi camera module (requires picamera package)
# from camera_pi import Camera

app = Flask(__name__)


@app.route('/')
def index():
    """Video streaming home page."""
    return render_template('index.html')


def gen(camera):
    """Video streaming generator function."""
    while True:
        time.sleep(0.1)
        frame = camera.get_frame()
        yield (frame)


@app.route('/video_feed')
def video_feed():
    """Video streaming route. Put this in the src attribute of an img tag."""
    return Response(gen(Camera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True, threaded=True)


camera.py

from time import time

from PIL import Image
from PIL import ImageGrab
import sys

if sys.platform == "win32":
    grabber = Image.core.grabscreen

class Camera(object):

    def __init__(self):
        #self.frames = [open('shot0' + str(f) + '.png', 'rb').read() for f in range(1,61)]
        self.frames = [ImageGrab.grab() for f in range(1,61)]

    def get_frame(self):
        return self.frames[int(time()) % 3]

完整错误:  Link

1 个答案:

答案 0 :(得分:0)

响应有效负载必须是一个字节序列。在该示例中,返回的图像是JPEG作为bytes个对象。

但是,ImageGrab.grab()返回的图像是一些PIL图像类而不是字节。因此,请尝试将图像保存为JPEG bytes

import io

仅为gen中的每次迭代拍摄屏幕截图:

class Camera(object):
    def get_frame(self):
        frame = ImageGrab.grab()
        img_bytes = io.BytesIO()
        frame.save(img_bytes, format='JPEG')
        return img_bytes.getvalue()

gen函数:

def gen(camera):
    while True:
        time.sleep(0.1)
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')