首页 > 解决方案 > “图像”对象没有“读取”属性

问题描述

我想使用存储在字典中的图像,将其转换为 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)

标签: pythonpython-3.xpython-imaging-library

解决方案


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

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

错误来自Image.open,它希望您将文件名、文件对象pathlib.Path对象作为第一个位置参数传递给它:

PIL.Image.open(fp, mode='r', formats=None)

Parameters

fp– 文件名(字符串)、pathlib.Path 对象或文件对象。文件对象必须实现file.readfile.seekfile.tell方法,并以二进制模式打开。

在 Python 中,文件对象有一个read方法,并且只需在传递的文件对象上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对象没有读取方法,也不应该有,因为图像数据已经加载到内存中。您现在可以Image在对象上使用 -related 函数,例如将它们附加到列表以创建 GIF。

因此,只需删除Image.open呼叫,它就会按预期工作。

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

推荐阅读