Ich habe ein Bild mit PIL generiert . Wie kann ich es in einer Zeichenfolge im Speicher speichern? Die Image.save()
Methode erfordert eine Datei.
Ich möchte mehrere solcher Bilder im Wörterbuch speichern.
Ich habe ein Bild mit PIL generiert . Wie kann ich es in einer Zeichenfolge im Speicher speichern? Die Image.save()
Methode erfordert eine Datei.
Ich möchte mehrere solcher Bilder im Wörterbuch speichern.
Mit der BytesIO
Klasse können Sie einen Wrapper um Zeichenfolgen erstellen, der sich wie eine Datei verhält. Das BytesIO
Objekt bietet dieselbe Schnittstelle wie eine Datei, speichert den Inhalt jedoch nur im Speicher:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Sie müssen das Ausgabeformat explizit mit dem format
Parameter angeben , da sonst PIL einen Fehler auslöst, wenn versucht wird, ihn automatisch zu erkennen.
Wenn Sie das Bild aus einer Datei geladen haben format
, enthält es einen Parameter, der das ursprüngliche Dateiformat enthält. In diesem Fall können Sie es verwenden format=image.format
.
In alten Python 2-Versionen hätten Sie vor der Einführung des Moduls stattdessen io
das StringIO
Modul verwendet.
You can use a file object instead of a filename. In this case, you must always specify the format.
Wenn das erste Argument ein Dateiobjekt ist, müssen Sie das zweite Argument übergeben, das das Format ist (z'PNG'
. B. ).from io import StringIO
image.save(output, format=image.format)
Für Python3 muss BytesIO verwendet werden:
Lesen Sie mehr: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
quelle
Die Lösung von etw hat bei mir nicht funktioniert,
weil in ...
Es wurde versucht, das Format anhand der Erweiterung im Dateinamen zu ermitteln, die im StringIO-Fall nicht vorhanden ist
Sie können die Formaterkennung umgehen, indem Sie das Format selbst in einem Parameter festlegen
quelle
save()
Sie können sowohl ein dateiähnliches Objekt als auch einen Pfad verwenden, sodass Sie einen speicherinternen Puffer wie den folgenden verwenden könnenStringIO
:quelle
Mit modern (ab Mitte 2017 Python 3.5 und Pillow 4.0):
StringIO scheint nicht mehr so zu funktionieren wie früher. Die BytesIO-Klasse ist der richtige Weg, um damit umzugehen. Die Speicherfunktion von Pillow erwartet einen String als erstes Argument und sieht StringIO überraschenderweise nicht als solches. Das Folgende ähnelt älteren StringIO-Lösungen, jedoch mit BytesIO an seiner Stelle.
quelle
Wenn Sie sagen "Ich möchte, dass die Anzahl solcher Bilder im Wörterbuch gespeichert wird", ist nicht klar, ob es sich um eine In-Memory-Struktur handelt oder nicht.
Sie müssen nichts davon tun, um ein Bild in Erinnerung zu behalten. Behalten Sie das
image
Objekt einfach in Ihrem Wörterbuch.Wenn Sie Ihr Wörterbuch in eine Datei schreiben möchten, sollten Sie sich die
im.tostring()
Methode und dieImage.fromstring()
Funktion ansehenhttp://effbot.org/imagingbook/image.htm
Das "Format" (.jpeg, .png usw.) spielt auf der Festplatte nur eine Rolle, wenn Sie die Dateien austauschen. Wenn Sie keine Dateien austauschen, spielt das Format keine Rolle.
quelle