Python PIL – открыть изображение из файлового объекта: файл не открыт для чтения

imgfile = open('myimage.png', 'wb')
imgfile.write(decodestring(base64_image))

f = Image.open(imgfile)

imgfile.close()

я могу write() строку base64 как изображение в imgfile. но когда я пытаюсь открыть этот файл с помощью PIL, я получаю

File not open for reading

Что я делаю неправильно?


person doniyor    schedule 29.12.2014    source источник
comment
@MartijnPieters извините, это опечатка   -  person doniyor    schedule 29.12.2014


Ответы (2)


Вы открыли файл на запись, а не на чтение. Вам нужно будет использовать двойной режим и сначала перемотать указатель файла:

with open('myimage.png', 'w+b') as imgfile:
    imgfile.write(decodestring(base64_image))
    imgfile.seek(0)
    f = Image.open(imgfile)

Здесь w+ означает запись и чтение, см. open() документацию:

'+'
открыть файл на диске для обновления (чтение и запись)

Для двоичного доступа для чтения и записи режим 'w+b' открывает и усекает файл до 0 байт. 'r+b' открывает файл без усечения.

Однако здесь нет необходимости использовать файл на диске; вместо этого используйте файл в памяти:

from io import BytesIO

imgfile = BytesIO(decodestring(base64_image))
f = Image.open(imgfile)
person Martijn Pieters    schedule 29.12.2014
comment
фантастический! Спасибо. я завидую шапкам кстати ;) - person doniyor; 29.12.2014

Проблема здесь в том, что вы открываете файл для записи с помощью wb, используйте w+b, чтобы открыть его и для чтения.

Подробное объяснение здесь.

person Sebi    schedule 29.12.2014