Я загружаю изображения из автономной системы (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'])
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 исходный размер изображения, но это не помогло.
попробовал этот режим, похоже, не влияет. файл в формате jpg, кстати. Других вариантов декодера в документации я не нашел Pillow.readthedocs.io/en/stable/reference/Image.html
обычно я использовал что-то вроде Image.open(io.Bytes(image_data_response.content), ...)
Мой герой, это сработало, тест = Image.open(io.BytesIO(image_data_response.content)) Продолжайте и опубликуйте ответ.
Вашими собственными словами, где в коде указаны decoder_name = "raw" и mode = "RGBA", что именно, по вашему мнению, означают эти значения и как вы их выбрали? Учитывая эти настройки и размеры изображения, сколько байтов данных, по вашему мнению, потребуется? (Если вы хотите использовать подобные инструменты, сначала вы должны быть в состоянии уверенно ответить на такой вопрос.) Пытались ли вы выяснить, какой объем данных вы на самом деле получаете? Это адекватная сумма? Вы пробовали посмотреть данные? Если вы посмотрите на данные, сможете ли вы распознать формат?






Обычно я использую что-то вроде
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)
ты уверен, что это
RGBA? Может быть, это толькоRGB? И, возможно, декодер неraw, но, например.png(Если он существует)