如何将pylab图保存到可以读入PIL图像的内存文件中?

nye*_*e17 47 python matplotlib python-imaging-library

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()
Run Code Online (Sandbox Code Playgroud)

错误说,

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")
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我不希望解决方案涉及额外的包,谢谢.

unu*_*tbu 85

记得打电话,buf.seek(0)所以Image.open(buf)从头开始阅读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()
Run Code Online (Sandbox Code Playgroud)


kot*_*ane 9

我喜欢将它封装在一个函数中:

def fig2img(fig):
    """Convert a Matplotlib figure to a PIL Image and return it"""
    import io
    buf = io.BytesIO()
    fig.savefig(buf)
    buf.seek(0)
    img = Image.open(buf)
    return img
Run Code Online (Sandbox Code Playgroud)

然后我可以这样轻松地调用它:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

x = np.arange(-3,3)
plt.plot(x)
fig = plt.gcf()

img = fig2img(fig)
img.show()
Run Code Online (Sandbox Code Playgroud)