2016-07-30 57 views
3

Ich möchte einen Imagestream von meinem rbpi zu meinem Server einrichten.Kissen Attribut Fehler

Also möchte ich einen Netzwerk-Stream in der http://picamera.readthedocs.io/en/release-1.12/recipes1.html#streaming-capture discripted einrichten.

Das hat gut funktioniert, aber jetzt möchte ich das aufgenommene Bild speichern.

-> (modifizierte den Server-Skript)

import io 
import socket 
import struct 
from PIL import Image 

# Start a socket listening for connections on 0.0.0.0:8000 (0.0.0.0 means 
# all interfaces) 
server_socket = socket.socket() 
server_socket.bind(('0.0.0.0', 8000)) 
server_socket.listen(0) 

# Accept a single connection and make a file-like object out of it 
connection = server_socket.accept()[0].makefile('rb') 
try: 
    while True: 
     # Read the length of the image as a 32-bit unsigned int. If the 
     # length is zero, quit the loop 
     image_len = struct.unpack('<L', connection.read(struct.calcsize('<L')))[0] 
     if not image_len: 
      break 
     # Construct a stream to hold the image data and read the image 
     # data from the connection 
     image_stream = io.BytesIO() 
     image_stream.write(connection.read(image_len)) 
     # Rewind the stream, open it as an image with PIL and do some 
     # processing on it 
     image_stream.seek(0) 
     image = Image.open(image_stream) 
     print('Image is %dx%d' % image.size) 
     image.verify() 
     print('Image is verified') 
     im = Image.new("RGB", (640,480), "black") #the saving part 
     im = image.copy() 
     im.save("./img/test.jpg","JPEG") 
finally: 
    connection.close() 
    server_socket.close() 

Aber es gibt mir folgenden Fehlercode:

Traceback (most recent call last): 
    File "stream.py", line 33, in <module> 
    im = image.copy() 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 781, in copy 
    self.load() 
    File "/usr/lib/python2.7/dist-packages/PIL/ImageFile.py", line 172, in load 
    read = self.fp.read 
AttributeError: 'NoneType' object has no attribute 'read' 

Wie kann ich dieses Problem beheben?

+1

Möglicherweise müssen Sie 'image.load()' vor 'image.copy()' aufrufen. Die Dokumentation macht diesen Ton überflüssig, aber Pillow hat bekanntermaßen Bugs ... – martineau

+0

Dies reduziert den Fehler in Zeile 781. Aber der zweite Fehler ist immer noch da. – Meitoasty

Antwort

2

Ich habe kein Raspberry-Pi, aber entschieden, um zu sehen, ob ich das Problem trotzdem reproduzieren könnte. Auch für die Eingabe habe ich gerade eine Image-Datei auf der Festplatte erstellt, um alle Socket-Sachen zu eliminieren. Sicher genug, ich habe genau den gleichen Fehler wie du. (Hinweis: IMO sollten Sie diese Vereinfachung getan haben, sich selbst und veröffentlichte ein MCVE das Problem veranschaulicht (siehe How to create a Minimal, Complete, and Verifiable example im SO-Hilfe)

das Problem zu bekommen zu gehen weg ich einen Aufruf an die image.load() Methode hinzugefügt sofort. ., nachdem die Image.open() Aussage und Dinge zu arbeiten begannen war nicht nur der Fehler weg, aber die Ausgabedatei schien in Ordnung, auch

mit dem Update meines einfacher Test Code Hier ist angegeben:.

import io 
import os 
from PIL import Image 

image_filename = 'pillow_test.jpg' 

image_len = os.stat(image_filename).st_size 
image_stream = io.BytesIO() 
with open(image_filename, 'rb') as imagefile: 
    image_stream.write(imagefile.read(image_len)) 
image_stream.seek(0) 
image = Image.open(image_stream) 
image.load() ########## ADDED LINE ########## 
print('Image is %dx%d' % image.size) 
image.verify() 
print('Image is verified') 
im = Image.new("RGB", (640,480), "black") #the saving part 
im = image.copy() 
im.save("pillow_test_out.jpg","JPEG") 
print('image written') 

der Schlüssel wurde diese Passage aus der pillow documentation für die PIL.Image.open() Funktion:

Dies ist eine faule Operation; Diese Funktion identifiziert die Datei, aber die Datei bleibt offen und die tatsächlichen Bilddaten nicht aus der Datei lesen, bis Sie versuchen, die Daten zu verarbeiten (oder   Anruf   die   load()   Methode).

(Hervorhebung von mir) Sie würden denken, die image.verify() diese überflüssig machen würde, da es wie die Überprüfung der „Datei“ scheint erfordern würde, die Daten, um den Laden es zu überprüfen. Ich vermute, das ist wahrscheinlich ein Fehler und Sie sollten es melden.