“图像”对象没有“读取”属性

时间:2019-10-19 23:47:56

标签: python python-3.x python-imaging-library

我想使用存储在词典中的图像将其转换为GIF。字典中的图像就是这种类型:

people={
    1: <PIL.Image.Image image mode=RGBA size=16x16 at 0x10962C510>,
    2: <PIL.Image.Image image mode=RGBA size=16x16 at 0x1098D7F90>,
    3: <PIL.Image.Image image mode=RGBA size=16x16 at 0x1098D7F50>}

我认为是枕头图像。但是为什么我总是会收到此错误:

  

“图像”对象没有“读取”属性

这是什么意思?

完整错误:

File "/***view.py", line 266, in convert_gif
    new_frame = Image.open(imgs[count])
File "/***/python3.7/site-packages/PIL/Image.py", line 2775, in open
    prefix = fp.read(16)
AttributeError: 'Image' object has no attribute 'read' –

代码:

self._images = { 
    people: {
        1: <PIL.Image.Image image mode=RGBA size=16x16 at 0x10962C510>, 
        2: <PIL.Image.Image image mode=RGBA size=16x16 at 0x1098D7F90>, 
        3: <PIL.Image.Image image mode=RGBA size=16x16 at 0x1098D7F50>
    }
}

def convert_gif(self):

    imgs = self._images["people"]
    number = len(imgs)
    count=1

    while count <= number:
        new_frame = Image.open(imgs[count])
        self._frames.append(new_frame)
        count += 1

    self._frames[0].save('png_to_gif.gif', format='GIF', append_images=self._frames[1:], save_all=True, duration=300, loop=0)

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中指出的那样,问题是这样的:

imgs = self._images["people"]
...
new_frame = Image.open(imgs[count])

错误来自Image.open,该错误希望您将其传递给file objectfp参数)。在Python中,文件对象具有read method,而Image.open只是在传递的文件对象上调用read方法。它将读取图像文件并将其转换为Image对象。

但是如果您检查imgs[count]的类型,它已经已经是Image对象。

curr_img = imgs[count]
print(curr_img)  
# <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=240x160 at 0x7F5C00B74588>

并且Image objects没有读取方法,它们也不应该具有读取方法,因为您已经可以使用与Image相关的功能(例如将它们附加到列表中以创建GIF)

因此,只需删除Image.open调用,它将按预期工作。

while count <= number:
    new_frame = imgs[count]
    self._frames.append(new_frame)
    count += 1