Как создать/получить/открыть изображение из 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).
...тем не менее, вы уверены, что ваша версия PIL скомпилирована с поддержкой AVIF? Это относительно современный формат файлов; версия библиотеки, созданная для Python 2.x, может быть слишком старой. (Это место, где уверенность в том, что расширение .jpg
имеет смысл, может направить вас в неправильном направлении; настоящий браузер будет смотреть на тип MIME, а не на расширение файла).
Я предоставляю ссылку и URL, где вы можете получить полную информацию. В нем более 100 000 символов, и здесь слишком много символов. Не уверен, что еще вам нужно. Текст, который я включил, отражает то, что я пытаюсь решить.
Верно, и это файл AVIF. Он вышел в 2019 году. Это намного новее, чем Python 2.7. Поэтому вам понадобятся гораздо более современные инструменты.
Тем не менее, «полное значение», находящееся только за ссылкой и не включенное в сам вопрос, означает, что вопрос не полностью определен, чтобы на него можно было ответить отдельно (предполагается, что вопросы по-прежнему имеют смысл для читателей, даже если все ссылки, содержащиеся в них, перерыв). Если бы в рамках вопроса вы сказали, что пытаетесь проанализировать файл AVIF вместо того, чтобы ожидать, что люди перейдут по ссылке и поймут это, это было бы другое дело — это было бы частью автономного Спецификация.
Я уже объяснил вашу проблему. То, что вам не нравится это объяснение, не делает его неверным.
AVIF не поддерживается PIL, см. stackoverflow.com/a/71113132/2836621
Если вы предоставили ответ, то я думаю, что ваш язвительный комментарий «недостаточно указано для ответственности» был неправильным ... Ваш первый и единственный комментарий мог быть чем-то вроде: «Пример, который вы показываете, представляет собой формат AVIF». . Я не думаю, что это поддерживается PIL для Python 2.7». Простой, полезный.
Верно. Дело в том, что мне пришлось сделать (хорошо информированное) предположение, что ваш ответ — это AVIF (поддерживается заголовком ответа и параметрами в URL-адресе, используемом для получения этого ответа), но это все еще предположение; в самом вопросе нет убедительного доказательства, пока мы не выйдем за рамки доказательств, включенных «в сам вопрос», чтобы загрузить и проанализировать фактический связанный файл.
Поддерживаемые форматы здесь Pillow.readthedocs.io/en/stable/handbook/…
К счастью, другим людям не требовались все 100 000 символов, чтобы идентифицировать его как AVIF. Зная формат, я смог найти решение, которое и опубликовал. Чарльз Даффи, если вы не знаете ответа, просто прокрутите дальше и позвольте другим ответить.
\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))
Более простой коленный рефлекс «недостаточно определен, чтобы нести ответственность». Пример буквального значения не является спецификацией формата.