2011-12-22 18 views
25

mới đối với PIL, nhưng muốn nhận được giải pháp nhanh chóng. Sau đây là phát súng đầu tiên của tôi mà không bao giờ hoạt động:làm thế nào để lưu một hình pylab vào tập tin trong bộ nhớ mà có thể được đọc vào hình ảnh 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ỗi nói,

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") 

bất kỳ ý tưởng? Tôi không muốn giải pháp liên quan đến các gói phụ, cảm ơn.

Trả lời

46

Hãy nhớ để gọi buf.seek(0) nên Image.open(buf) bắt đầu đọc từ đầu 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

Awesome! Nó hoạt động như một say mê! ngay cả khi tôi thay thế 'io.BytesIO' bằng' StringIO' ban đầu của tôi. Bạn có thể nhắc bạn về lý do tại sao bạn chọn sử dụng cái cũ ở đây không? Cảm ơn! – nye17

+1

Đối với Python2.6 trở lên, sử dụng 'io.BytesIO' thay vì' cStringIO.StringIO' để tương thích về phía trước. Trong Python3, các mô-đun 'cStringIO',' StringIO' đã biến mất. Chức năng của chúng là tất cả trong mô-đun 'io'. – unutbu

+0

gotcha, cảm ơn! – nye17

Các vấn đề liên quan