Получить изображение из данных, имеющих вид \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).

🤔 А знаете ли вы, что...
Python позволяет создавать графические приложения с использованием библиотеки PyQt.


63
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))