Risposte:
Puoi usare la BytesIO
classe per ottenere un wrapper attorno alle stringhe che si comporta come un file. L' BytesIO
oggetto fornisce la stessa interfaccia di un file, ma salva il contenuto solo in memoria:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Devi specificare esplicitamente il formato di output con il format
parametro, altrimenti PIL solleverà un errore quando tenterà di rilevarlo automaticamente.
Se hai caricato l'immagine da un file, ha un format
parametro che contiene il formato del file originale, quindi in questo caso puoi usare format=image.format
.
Nelle vecchie versioni di Python 2 prima dell'introduzione del io
modulo avresti invece usato il StringIO
modulo.
You can use a file object instead of a filename. In this case, you must always specify the format.
Quindi se il primo argomento è un oggetto file, devi passare il secondo argomento, che è il formato (ad esempio 'PNG'
).
from io import StringIO
image.save(output, format=image.format)
Per Python3 è necessario utilizzare BytesIO:
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')
Per saperne di più: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
la soluzione di sth non ha funzionato per me
perché in ...
Imaging / PIL / Image.pyc line 1423 -> raise KeyError (ext) # extension unknown
Stava cercando di rilevare il formato dall'estensione nel nome del file, che non esiste nel caso StringIO
È possibile bypassare il rilevamento del formato impostando il formato personalmente in un parametro
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
può prendere un oggetto simile a un file così come un percorso, quindi puoi usare un buffer in memoria come un StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
Con Modern (a partire dalla metà del 2017 Python 3.5 e Pillow 4.0):
StringIO non sembra più funzionare come una volta. La classe BytesIO è il modo corretto per gestire questo. La funzione di salvataggio di Pillow si aspetta una stringa come primo argomento e sorprendentemente non vede StringIO come tale. Quanto segue è simile alle vecchie soluzioni StringIO, ma con BytesIO al suo posto.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
Quando dici "Mi piacerebbe avere il numero di tali immagini memorizzate nel dizionario", non è chiaro se si tratta di una struttura in memoria o meno.
Non è necessario fare nulla di tutto questo per umiliare un'immagine nella memoria. Tieni l' image
oggetto nel tuo dizionario.
Se hai intenzione di scrivere il tuo dizionario su un file, potresti voler guardare il im.tostring()
metodo e la Image.fromstring()
funzione
http://effbot.org/imagingbook/image.htm
im.tostring () => stringa
Restituisce una stringa contenente dati pixel, utilizzando il codificatore "grezzo" standard.
Image.fromstring (mode, size, data) => image
Crea una memoria immagine dai dati dei pixel in una stringa, utilizzando il decodificatore "grezzo" standard.
Il "formato" (.jpeg, .png, ecc.) Conta solo sul disco quando si scambiano i file. Se non stai scambiando file, il formato non ha importanza.