Konvertiere KISSEN Bild in StringIO

8

Ich schreibe ein Programm, das Bilder in einer Vielzahl gebräuchlicher Bildformate empfangen kann, aber alle in einem einheitlichen Format untersuchen muss. Es ist nicht wirklich wichtig, welches Bildformat, hauptsächlich, dass alle gleich sind. Da ich das Bildformat konvertieren und dann weiter mit dem Bild arbeiten muss, möchte ich es nicht auf dem Datenträger speichern; einfach umwandeln und weitermachen. Hier ist mein Versuch mit StringIO:

%Vor%

Es wird der folgende Fehler zurückgegeben:

%Vor%

Ich habe es auch mit io.BytesIO mit den gleichen Ergebnissen versucht. Irgendwelche Vorschläge, wie man das angeht?

    
Jed Estep 23.07.2014, 20:52
quelle

1 Antwort

19

Es gibt zwei Typen von cStringIO.StringIO() -Objekten, abhängig davon, wie die Instanz erstellt wurde; eine für das Lesen, die andere für das Schreiben. Sie können diese nicht austauschen.

Wenn Sie ein leeres cStringIO.StringIO() -Objekt erstellen, erhalten Sie wirklich eine cStringIO.StringO (beachten Sie die O am Ende) Klasse, es kann nur als Ausgabe , dh schreibe an.

Umgekehrt erzeugt die Erstellung eines ersten Inhalts einen cStringIO.StringI -Objekt (endet in I für die Eingabe), Sie können niemals in ihn schreiben, nur davon lesen.

Dies gilt insbesondere für nur das Modul cStringIO ; Das StringIO (reines Python-Modul) hat diese Einschränkung nicht. Die Dokumentation verwendet die Aliase cStringIO.InputType und cStringIO.OutputType für diese und hat folgendes zu sagen:

  

Ein weiterer Unterschied zum Modul StringIO besteht darin, dass das Aufrufen von StringIO() mit einem Zeichenfolgenparameter ein schreibgeschütztes Objekt erstellt. Im Gegensatz zu einem Objekt, das ohne einen Zeichenfolgenparameter erstellt wurde, verfügt es nicht über Schreibmethoden. Diese Objekte sind in der Regel nicht sichtbar. Sie erscheinen in den Rückverfolgungen als StringI und StringO .

Verwenden Sie cStringIO.StringO.getvalue() , um die Daten aus einer Ausgabedatei zu erhalten:

%Vor%

Sie können stattdessen io.BytesIO() verwenden, aber dann müssen Sie nach dem Schreiben zurückspulen:

%Vor%     
Martijn Pieters 23.07.2014, 21:01
quelle