Объект 'Image' не имеет атрибута 'read' - PullRequest
1 голос
/ 20 октября 2019

Я хочу использовать изображения, хранящиеся в словаре, чтобы конвертировать их в 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>}

Я думаю, что это изображение подушки. Но почему я всегда получаю эту ошибку:

У объекта 'Изображение' нет атрибута 'read'

Что это значит?

Полныйошибка:

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 Ответ

1 голос
/ 21 октября 2019

Как отмечают другие в комментариях, проблема заключается в следующем:

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

Ошибка происходит от Image.open, которая ожидает, что вы передадите ей файловый объект (параметр fp). В 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 (например, добавление их ксписок для создания GIF).

Так что просто удалите вызов Image.open, и он будет работать как положено.

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