Невозможно идентифицировать файл изображения io.BytesIO на Raspberry Pi с использованием библиотеки PiCamera и PIL

У меня возникли проблемы с использованием вывода функции захвата PiCamera (направленной в потоке BytesIO) и его открытием с помощью библиотеки PIL. Вот код (на основе базовых примеров PiCamera):

#Camera stuff
camera = PiCamera()
camera.resolution = (640, 480)
stream = io.BytesIO()
sleep(2)

try:
    for frame in camera.capture_continuous(stream, format = "jpeg", use_video_port = True):
        frame.seek(0)
        image = Image.open(frame) //THIS IS WHERE IS CRASHES
        #OTHER STUFF THAT IS NON IMPORTANT GOES HERE
        frame.truncate(0)
finally:
    camera.close()
    stream.close()

Ошибка: PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0xaa01cf00>

Любая помощь будет принята с благодарностью:)

Хорошего дня!

1 ответ

Проблема проста, но мне интересно, почему библиотека io работает именно так. Просто нужно искать поток обратно до 0 после его усечения или искать до 0, а затем просто вызывать truncate без параметра (все после того, как вы закончите открывать изображение). Вот так:

for frame in camera.capture_continuous(stream, format = "jpeg", use_video_port = True):
    stream.seek(0)
    image = Image.open(stream)
    #Do stuff with image
    stream.seek(0)
    stream.truncate()

Обычно, когда вы открываете изображение и выполняете с ним какие-либо операции, указатель BytesIO может перемещаться и попадать в другое место, кроме нулевой позиции. После этого, когда вы вызываете truncate(0), он не перемещает указатель обратно в ноль, как я думал (мне кажется логичным переместить указатель обратно туда, где происходит усечение). Когда код запускается еще раз, захват записывается в поток, но на этот раз он не начинает запись в начале, и после этого все прерывается.

Надеюсь, это поможет кому-то в будущем:)

Другие вопросы по тегам