【问题标题】:how to save a pylab figure into in-memory file which can be read into PIL image?如何将pylab图形保存到可以读入PIL图像的内存文件中?
【发布时间】:2012-01-25 18:54:00
【问题描述】:

以下是我的第一个尝试,但永远不会成功:

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

错误说,

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

有什么想法吗?我不希望解决方案涉及额外的包。

【问题讨论】:

    标签: python python-imaging-library matplotlib


    【解决方案1】:

    记得打电话给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()
    

    【讨论】:

    • 太棒了!它就像一个魅力!即使我用我原来的StringIO 替换io.BytesIO。你能提醒你为什么选择在这里使用前者吗?谢谢!
    • 对于 Python2.6 或更高版本,使用 io.BytesIO 而不是 cStringIO.StringIO 以获得前向兼容性。在 Python3 中,cStringIOStringIO 模块消失了。它们的功能都在io 模块中。
    • 如何为 .png 设置一个合理的文件名?似乎只是打电话给我的fig.png - 谢谢。
    • @josh: plt.savefig(buf, format='png') 写入内存中的 BytesIO 对象。没有创建文件。使用savefig 更常用的方法是调用plt.savefig('/path/to/anyfilenameyouwant.png'),它允许您指定文件名。
    • 如果你想把图像作为一个数组,你可以不用PIL/pillow,使用im = plt.imread(buf)。您还可以使用plt.imsave('/path/to/saved/file.png', im) 保存im 数组。
    【解决方案2】:

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

    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
    

    那我可以这样轻松调用:

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

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多