有没有办法用PIL读取截断的gif?

时间:2013-08-29 04:50:43

标签: python python-imaging-library

我正在尝试使用Python阅读GIF图像,该图像似乎与浏览器兼容,但不适用于PIL。使用下面的代码

from PIL import Image

im = Image.open('flow.gif')
im = im.convert('RGB')

我得到以下追溯

---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-35-6f71a00ad83b> in <module>()
      1 im = Image.open('flow.gif')
----> 2 im = im.convert('RGB')

/Users/.../site-packages/PIL/Image.pyc in convert(self, mode, data, dither, palette, colors)
    672                 return self.copy()
    673 
--> 674         self.load()
    675 
    676         if data:

/Users/.../site-packages/PIL/ImageFile.pyc in load(self)
    218                             break
    219                         else:
--> 220                             raise IOError("image file is truncated (%d bytes not processed)" % len(b))
    221 
    222                     b = b + s

IOError: image file is truncated (241 bytes not processed)

这是图片:problematic gif image

我尝试使用ImageMagick将图像转换为另一种格式,但ImageMagick也不喜欢它。如果我在OSX中使用预览,那么读取图像就没有问题,比如浏览器。似乎应用程序可以处理这些问题,但不是PIL。关于变通方法或解决方案的任何想法?

2 个答案:

答案 0 :(得分:4)

在代码块之前的某个地方,只需添加以下内容:

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

我针对您提供的照片对此进行了测试,并且我能够毫无问题地处理图像。

编辑:看起来这对Pillow捆绑的PIL版本有帮助(&#34; pip install pillow&#34;),但可能不适用于PIL的默认安装

答案 1 :(得分:1)

opencv可以处理gif。它将它们视为像任何其他视频或流一样的帧容器。 如果安装了它,您可以执行以下操作:

import cv2
from PIL import Image
gif = cv2.VideoCapture('file.gif')
ret,frame = gif.read() # ret=True if it finds a frame else False. Since your gif contains only one frame, the next read() will give you ret=False
img = Image.fromarray(frame)
img = img.convert('RGB')