Создание изображения из байтов приводит к ошибке ValueError: недостаточно данных изображения

Я загружаю изображения из автономной системы (Google Фото). Я могу загружать файлы и сохранять их локально, и это работает нормально.

Однако я пытаюсь загрузить их и превратить в образ PIL, чтобы я мог использовать их и не хранить их сначала локально.

Отлично работает, чтобы сохранить файл

    for media_item in media_items:
        image_data_response = authed_session.get(media_item['baseUrl'] + "=w500-h250")
        print(image_data_response)
        with open(media_item['filename'], "wb") as my_file:
            my_file.write(image_data_response.content)
        print(media_item['id'], media_item['filename'])

попытаться создать образ PIL

for media_item in media_items:
        width = media_item['mediaMetadata']['width']
        height = media_item['mediaMetadata']['height']
        image_size = (500, 250)  # Width, height
        image_data_response = authed_session.get(media_item['baseUrl'] + "=w500-h250")

        test = Image.frombytes(mode = "RGBA", size=image_size, data=image_data_response.content, decoder_name = "raw")            
        result.append(test)

Моя ошибка

Независимо от того, что я пытаюсь, я продолжаю получать

ValueError: недостаточно данных изображения

Я даже пытался указать PIL исходный размер изображения, но это не помогло.

ты уверен, что это RGBA? Может быть, это только RGB? И, возможно, декодер не raw, но, например. png (Если он существует)

furas 06.06.2024 11:18

попробовал этот режим, похоже, не влияет. файл в формате jpg, кстати. Других вариантов декодера в документации я не нашел Pillow.readthedocs.io/en/stable/reference/Image.html

Linda Lawton - DaImTo 06.06.2024 11:22

обычно я использовал что-то вроде Image.open(io.Bytes(image_data_response.content), ...)

furas 06.06.2024 11:24

Мой герой, это сработало, тест = Image.open(io.BytesIO(image_data_response.content)) Продолжайте и опубликуйте ответ.

Linda Lawton - DaImTo 06.06.2024 11:33

Вашими собственными словами, где в коде указаны decoder_name = "raw" и mode = "RGBA", что именно, по вашему мнению, означают эти значения и как вы их выбрали? Учитывая эти настройки и размеры изображения, сколько байтов данных, по вашему мнению, потребуется? (Если вы хотите использовать подобные инструменты, сначала вы должны быть в состоянии уверенно ответить на такой вопрос.) Пытались ли вы выяснить, какой объем данных вы на самом деле получаете? Это адекватная сумма? Вы пробовали посмотреть данные? Если вы посмотрите на данные, сможете ли вы распознать формат?

Karl Knechtel 06.06.2024 14:41
Почему в 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
5
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Обычно я использую что-то вроде

img = Image.open(io.BytesIO(image_data_response.content), ...)

Документация для Image.frombytes:

Обратите внимание, что эта функция декодирует только данные пикселей, а не все изображения. Если у вас есть целое изображение в строке, оберните его в объект BytesIO, и используйте open(), чтобы загрузить его.


Если вы планируете загружать другие файлы, вы также можете попробовать использовать io.BytesIO()

например csv или excel для использования с pandas

df = pd.read_csv(io.BytesIO(file_data_response.content), ...)
df = pd.read_excel(io.BytesIO(file_data_response.content), ...)

Многие модули позволяют использовать file-like object вместо filename
. и это позволяет использовать io.BytesIO(data) или io.StringIO(data).

Но иногда бывают исключения.

например OpenCV не могу использовать cv2.imread(io.BytesIO(data)...)

img = cv2.imdecode(np.frombuffer(file_data_response.conten, np.uint8), cv2.IMREAD_UNCHANGED)

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