Невозможно идентифицировать файл изображения 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), он не перемещает указатель обратно в ноль, как я думал (мне кажется логичным переместить указатель обратно туда, где происходит усечение). Когда код запускается еще раз, захват записывается в поток, но на этот раз он не начинает запись в начале, и после этого все прерывается.
Надеюсь, это поможет кому-то в будущем:)