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