Подушка Python: чтение содержимого изображения из списка фрагментов байтов и сохранение на диск

Я прихожу к сценарию, в котором мне нужно использовать подушку 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 читать изображения из списка фрагментов байтов. Любая помощь будет очень признательна, спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет собрать куски в 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 МБ каждый от отправителя), может быть плохой идеей сбрасывать все в объем памяти. У подушки есть возможность сохранять изображение такими "сегментами"?

nonemaw 06.05.2022 18:05

Я добавил раздел, чтобы покрыть это в конце моего ответа.

Mark Setchell 06.05.2022 18:15

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