2009-03-14 15 views

risposta

150

Probabilmente è possibile utilizzare la classe StringIO per ottenere un wrapper attorno a stringhe che si comportano come un file. L'oggetto StringIO fornisce la stessa interfaccia di un file, ma salva il contenuto solo nella memoria:

try: 
    # python 2 
    from StringIO import StringIO 
except ImportError: 
    # python 3 
    from io import StringIO 

output = StringIO() 
image.save(output) 
contents = output.getvalue() 
output.close() 

questo potrebbe portare ad un KeyError se PIL cerca di riconoscere automaticamente il formato di output. Per evitare questo problema è possibile specificare il formato manualmente:

image.save(output, format="GIF") 
+1

Sì! Questo e 'esattamente quello che stavo cercando. Ho cercato su google ogni combinazione di python, string, reader, writer, buffer e non ho trovato nulla. Grazie! –

+0

Grazie - mi ha salvato molto la testa grattando questa mattina. –

+2

Non funziona per me :( Ho ricevuto questo errore KeyError in Imaging/PIL/Image.pyc 1423 -> aumento KeyError (ext) # estensione sconosciuta – Radian

7

Quando si dice "Mi piacerebbe avere il numero di tali immagini memorizzate nel dizionario", non è chiaro se si tratta di una struttura in memoria o no .

Non è necessario eseguire alcuna operazione per smorzare un'immagine in memoria. Basta mantenere l'oggetto image nel tuo dizionario.

Se avete intenzione di scrivere il dizionario in un file, si potrebbe desiderare di guardare im.tostring() metodo e la funzione Image.fromstring()

http://effbot.org/imagingbook/image.htm

im.tostring() => string

Restituisce una stringa contenente i dati del pixel , utilizzando il codificatore standard "raw" .

Image.fromstring (modalità, dimensioni, dati) => immagine

Crea una memoria immagini da pixel dati in una stringa, utilizzando il decoder "grezza" standard.

Il "formato" (.jpeg, .png, ecc.) Importa solo su disco quando si scambiano i file. Se non stai scambiando file, il formato non ha importanza.

+2

Sembra che voglia mantenere il formato PNG, non ridurlo a dati di pixel grezzi. –

10

save() può prendere un oggetto simile a file così come un percorso, in modo da poter utilizzare un buffer in memoria come uno StringIO:

buf= StringIO.StringIO() 
im.save(buf, format= 'JPEG') 
jpeg= buf.getvalue() 
+0

Grazie. StringIO - questo è quello che mi serve. – maxp

+0

L'interfaccia save() è molto più pulita dell'interfaccia tostring() quando si tratta di ottenere un formato di file PNG, JPEG o reale. – Kekoa

22

soluzione di qc non ha funzionato per me
perché in ...

Immagine/PIL/Immagine.Linea pyc 1423 -> raise KeyError (ext) # sconosciuto estensione

Stava cercando di rilevare il formato dall'estensione nel nome del file, che non esiste nel caso in cui StringIO

è possibile ignorare la rilevazione del formato impostando il formato di se stessi 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() 
+0

Grazie !! Questo lo ha fatto per me –

20

per python3 è necessario per 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

1

Con moderna (a partire da metà-2017 Python 3.5 e cuscino 4,0):

StringIO non sembra funzionare come una volta. La classe BytesIO è il modo corretto per gestirlo. La funzione di salvataggio del cuscino si aspetta una stringa come primo argomento e sorprendentemente non vede StringIO come tale. Quanto segue è simile alle precedenti 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_data = faux_file.getvalue() 
image.save(faux_file, 'png') 
Problemi correlati