Получить изображение из данных, имеющих вид \x00\x00\x87

Как создать/получить/открыть изображение из URL-запроса, когда ответ выглядит следующим образом:

\x00\x00\x00 ftypavif\x00\x00\x00\ ... \x87"y~\x13 $%\\\xad ... xb5\xa07tR\x80

Гораздо дольше, конечно.

Пример такого URL-адреса — здесь (не мой сайт).

Обычно я делаю это так:

import requests
import urllib, cStringIO, PIL, io
from PIL import Image

ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
headers = {'User-agent': ua, 'Accept-Encoding':'gzip,deflate,sdch', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}

# below url returns regular image and code works 
imgurl = "https://media-cldnry.s-nbcnews.com/image/upload/t_focal-860x484,f_auto,q_auto:best/MSNBC/Components/Video/201610/tdy_food_brisket_161021__142565.jpg"

# below url does NOT work.
imgurl = "https://media-cldnry.s-nbcnews.com/image/upload/t_focal-860x484,f_avif,q_auto:eco,dpr_2/MSNBC/Components/Video/201610/tdy_food_brisket_161021__142565.jpg"

r = requests.get(imgurl, headers=None, verify=False,timeout=3)
image = Image.open(cStringIO.StringIO(r.content))

Ошибка неправильного URL-адреса: «IOError: невозможно идентифицировать файл изображения…».

я тоже попробовал

image = Image.open(io.BytesIO(r.content))

и различные версии

data = bytes.fromhex(r.content)
import binascii
data = binascii.a2b_hex(r.content)

Все они возвращают различные ошибки.

Обратите внимание, что я все еще использую Python 2.7 с PIL (Pillow).

Более простой коленный рефлекс «недостаточно определен, чтобы нести ответственность». Пример буквального значения не является спецификацией формата.

Charles Duffy 11.04.2024 19:44

...тем не менее, вы уверены, что ваша версия PIL скомпилирована с поддержкой AVIF? Это относительно современный формат файлов; версия библиотеки, созданная для Python 2.x, может быть слишком старой. (Это место, где уверенность в том, что расширение .jpg имеет смысл, может направить вас в неправильном направлении; настоящий браузер будет смотреть на тип MIME, а не на расширение файла).

Charles Duffy 11.04.2024 19:46

Я предоставляю ссылку и URL, где вы можете получить полную информацию. В нем более 100 000 символов, и здесь слишком много символов. Не уверен, что еще вам нужно. Текст, который я включил, отражает то, что я пытаюсь решить.

user984003 11.04.2024 19:50

Верно, и это файл AVIF. Он вышел в 2019 году. Это намного новее, чем Python 2.7. Поэтому вам понадобятся гораздо более современные инструменты.

Charles Duffy 11.04.2024 19:51

Тем не менее, «полное значение», находящееся только за ссылкой и не включенное в сам вопрос, означает, что вопрос не полностью определен, чтобы на него можно было ответить отдельно (предполагается, что вопросы по-прежнему имеют смысл для читателей, даже если все ссылки, содержащиеся в них, перерыв). Если бы в рамках вопроса вы сказали, что пытаетесь проанализировать файл AVIF вместо того, чтобы ожидать, что люди перейдут по ссылке и поймут это, это было бы другое дело — это было бы частью автономного Спецификация.

Charles Duffy 11.04.2024 19:52

Я уже объяснил вашу проблему. То, что вам не нравится это объяснение, не делает его неверным.

Charles Duffy 11.04.2024 19:53

AVIF не поддерживается PIL, см. stackoverflow.com/a/71113132/2836621

Mark Setchell 11.04.2024 19:55

Если вы предоставили ответ, то я думаю, что ваш язвительный комментарий «недостаточно указано для ответственности» был неправильным ... Ваш первый и единственный комментарий мог быть чем-то вроде: «Пример, который вы показываете, представляет собой формат AVIF». . Я не думаю, что это поддерживается PIL для Python 2.7». Простой, полезный.

user984003 11.04.2024 20:02

Верно. Дело в том, что мне пришлось сделать (хорошо информированное) предположение, что ваш ответ — это AVIF (поддерживается заголовком ответа и параметрами в URL-адресе, используемом для получения этого ответа), но это все еще предположение; в самом вопросе нет убедительного доказательства, пока мы не выйдем за рамки доказательств, включенных «в сам вопрос», чтобы загрузить и проанализировать фактический связанный файл.

Charles Duffy 11.04.2024 21:41

Поддерживаемые форматы здесь Pillow.readthedocs.io/en/stable/handbook/…

Mark Setchell 11.04.2024 21:42

К счастью, другим людям не требовались все 100 000 символов, чтобы идентифицировать его как AVIF. Зная формат, я смог найти решение, которое и опубликовал. Чарльз Даффи, если вы не знаете ответа, просто прокрутите дальше и позвольте другим ответить.

user984003 13.04.2024 20:21
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
11
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

\x00\x00\x00 ftypavif…
# below url does NOT work.
imgurl = "https://media-cldnry.s-nbcnews.com/image/upload/t_focal-860x484,f_avif,…

Это намек на то, что изображение имеет формат AVIF, который не поддерживается этой версией PIL.

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

Оказывается, формат данных — AVIF. Это не поддерживается «из коробки» в PIL/PILLOW, по крайней мере, в Python 2.7.

Я решил эту проблему, используя Pillow-avif-плагин.

После установки pip включите

import pillow_avif

Вот и все. Старый код тогда работает:

image = Image.open(cStringIO.StringIO(r.content))

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