Antworten:
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:
from io import BytesIO
from PIL import Image, ImageDraw
image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")
byte_io = BytesIO()
image.save(byte_io, 'PNG')
Lesen Sie mehr: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
Die Lösung von etw hat bei mir nicht funktioniert,
weil in ...
Imaging / PIL / Image.pyc Zeile 1423 -> KeyError (ext) # unbekannte Erweiterung auslösen
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
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
Sie können sowohl ein dateiähnliches Objekt als auch einen Pfad verwenden, sodass Sie einen speicherinternen Puffer wie den folgenden verwenden können StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
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.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
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 die Image.fromstring()
Funktion ansehen
http://effbot.org/imagingbook/image.htm
im.tostring () => string
Gibt eine Zeichenfolge zurück, die Pixeldaten enthält, wobei der Standard-Rohcodierer verwendet wird.
Image.fromstring (Modus, Größe, Daten) => Bild
Erstellt einen Bildspeicher aus Pixeldaten in einer Zeichenfolge unter Verwendung des Standarddecoders "roh".
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.