在PIL中打开base64字符串时出现奇怪的IOError

时间:2013-11-11 16:10:12

标签: python base64 python-imaging-library ioerror

我尝试在python shell中对图像进行编码并对其进行解码。我第一次在PIL中打开解码的base64字符串没有错误,如果我重复Image.open()命令我得到 IOError:无法识别图像文件。

>>> with open("/home/home/Desktop/gatherify/1.jpg", "rb") as image_file:
...     encoded_string = base64.b64encode(image_file.read())
>>> image_string = cStringIO.StringIO(base64.b64decode(encoded_string))
>>> img = Image.open(image_string)
>>> img
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=576x353 at 0xA21F20C>
>>> img.show() <-- Image opened without any errors. 
>>> img = Image.open(image_string)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1980, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

为什么会这样?

2 个答案:

答案 0 :(得分:4)

创建image_string时,您正在创建一个由字符串支持的伪文件对象。当您致电Image.open时,会读取这个假文件,将文件指针移动到文件的末尾。试图再次使用Image.open只会给你一个EOF。

您需要重新创建StringIO对象,或seek()到流的开头。

答案 1 :(得分:1)

image_string是类似文件的对象。类文件对象具有文件位置。

读取文件后,位置会提前。

除非您使用seek方法明确定位,否则后续发生在该位置。

所以如果你想重新打开文件:

...
image_string.seek(0) # reset file position to the beginning of the file.
img = Image.open(image_string)