Я прихожу к сценарию, в котором мне нужно использовать подушку python для чтения изображения из заданного списка фрагментов байтов (например, итератор с типом Iterator[bytes]
), а затем сохранить его в место.
Я надеюсь, что смогу придумать такой метод:
def save_image(chunks: Iterator[bytes]):
pil_image: Image = Image.open(chunks) # Here is where I am getting blocked
# ... some image operations
pil_image.save(SOME_PATH, format=pil_image.format)
Но кажется, что я не нашел никаких документов или других вопросов, которые могли бы решить мой вопрос, чтобы позволить подушке python читать изображения из списка фрагментов байтов. Любая помощь будет очень признательна, спасибо!
Вам нужно будет собрать куски в BytesIO
и передать накопленный буфер в качестве единственного параметра в Image.open()
.
Та же концепция, что и у здесь.
Не проверено, но предположительно это будет выглядеть примерно так:
from io import BytesIO
from PIL import Image
buf = BytesIO()
for chunk in chunks:
buf.write(chunk)
im = Image.open(buf)
Если вы имеете дело с очень большими или многочисленными фрагментами, вам может понадобиться накапливать их на диске, а не в памяти:
with open('image.bin', 'wb') as fd:
for chunk in chunks:
fd.write(chunk)
im = Image.open('image.bin')
Я добавил раздел, чтобы покрыть это в конце моего ответа.
Работает для меня, очень ценю это! Кстати, есть ли другой способ сделать это, если фрагмент байта действительно огромен (например, огромное изображение размером 400 МБ поставляется с итератором из 400 фрагментов по 1 МБ каждый от отправителя), может быть плохой идеей сбрасывать все в объем памяти. У подушки есть возможность сохранять изображение такими "сегментами"?