在 PIL.Image.tostring() "cannot identify image file" 之后

after PIL.Image.tostring() "cannot identify image file"

我想使用 string 来存储图像数据。

背景:在代码的其他部分,我加载了从网上下载的图像,并使用

存储为 string
imgstr = urllib2.urlopen(imgurl).read()
PIL.Image.open(StringIO.StringIO(imstr))

现在我对 'PIL.Image' 对象进行一些图像处理。我还想将这些对象转换为相同的 string 格式,以便它们可以在原始代码中使用。

这是我试过的。

>>> import PIL
>>> import StringIO

>>> im = PIL.Image.new("RGB", (512, 512), "white")
>>> imstr=im.tostring()

>>> newim=PIL.Image.open(StringIO.StringIO(imstr))
Traceback (innermost last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2006, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

我在网上找到了可能会发生这种情况的提示。例如 Python PIL: how to write PNG image to string 但是我无法为我的示例代码提取正确的解决方案。

下一次尝试是:

>>> imstr1 = StringIO.StringIO()
>>> im.save(imstr1,format='PNG')
>>> newim=PIL.Image.open(StringIO.StringIO(imstr1))
Traceback (innermost last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2006, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

您不必将现有的 StringIO 对象包装在另一个这样的对象中; imstr1 已经 一个文件对象。您所要做的就是回到起点:

imstr1 = StringIO.StringIO()
im.save(imstr1, format='PNG')
imstr1.seek(0)
newim = PIL.Image.open(imstr1)

您可以使用 StringIO.getvalue() method:

StringIO 对象中获取字节串
imstr1 = StringIO.StringIO()
im.save(imstr1, format='PNG')
imagedata = imstr1.getvalue()

然后您可以稍后将其加载回相反方向的 PIL.Image 对象:

newim = PIL.Image.open(StringIO.StringIO(imagedata))