2

我正在尝试使用 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)

这是图像:有问题的gif图像

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

4

2 回答 2

5

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

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

我根据您提供的照片对此进行了测试,并且可以毫无问题地使用该图像。

编辑:看起来这有助于与枕头捆绑的 PIL 版本(“pip install枕头”),但可能不适用于 PIL 的默认安装

于 2014-05-09T23:30:05.983 回答
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')
于 2013-11-21T18:11:38.483 回答