2011-12-22 9 views
25

nuovo per PIL, ma vuole ottenere una soluzione rapida fuori di esso. Il seguente è il mio primo colpo che non funziona mai:come salvare una figura pylab in un file in memoria che può essere letto nell'immagine PIL?

import cStringIO 
import pylab 
from PIL import Image 
pylab.figure() 
pylab.plot([1,2]) 
pylab.title("test") 
buffer = cStringIO.StringIO() 
pylab.savefig(buffer, format='png') 
im = Image.open(buffer.read()) 
buffer.close() 

l'errore dice,

Traceback (most recent call last): 
    File "try.py", line 10, in <module> 
    im = Image.open(buffer.read()) 
    File "/awesomepath/python2.7/site-packages/PIL/Image.py", line 1952, in open 
    fp = __builtin__.open(fp, "rb") 

tutte le idee? Non voglio che la soluzione coinvolga pacchetti extra, grazie.

risposta

46

ricordarsi di chiamare buf.seek(0) così Image.open(buf) inizia la lettura dal dall'inizio del buf:

import io 
from PIL import Image 
import matplotlib.pyplot as plt 

plt.figure() 
plt.plot([1, 2]) 
plt.title("test") 
buf = io.BytesIO() 
plt.savefig(buf, format='png') 
buf.seek(0) 
im = Image.open(buf) 
im.show() 
buf.close() 
+0

Impressionante! Esso funziona magicamente! anche quando sostituisco 'io.BytesIO' con il mio originale' StringIO'. Puoi ricordarti qual è il motivo per cui scegli di usare il primo qui? Grazie! – nye17

+1

Per Python2.6 o superiore, utilizzare 'io.BytesIO' anziché' cStringIO.StringIO' per la compatibilità diretta. In Python3, i moduli 'cStringIO',' StringIO' sono spariti. La loro funzionalità è tutto nel modulo 'io'. – unutbu

+0

gotcha, grazie! – nye17

Problemi correlati