Получение первого кадра изображения GIF в Python?

  • Установите JDK 7.0.55 и установите Java для Eclipse для JDK 7.0.55.
  • Создайте проект с помощью JDK 7.0.55, настроив путь сборки JDK 7.0.55.
  • Установите компилятор в Eclipse для JDK 7.0.55 с помощью меню Windows -> Предпочтения -> Java -> Компилятор - выберите 1.7.
1
задан pythonnoob 24 March 2019 в 20:45
поделиться

2 ответа

Я не собираюсь писать для вас все целиком, включая анализ двоичного содержимого файла GIF, но вот пример пошаговой загрузки файла с использованием популярного стороннего модуля запросов . ] (используя информацию в этом разделе своей документации). Надеюсь, это даст вам хорошую отправную точку.

import requests

img_url = 'https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif'
#img_filename = 'test.gif'

response = requests.get(img_url, stream=True)
if response.status_code != 200:
    print('Error:', response.status_code)
else:
    header = response.raw.read(6)
    print(header)  # b'GIF89a'

#    # Download whole file in chunks and save locally.
#    with open(img_filename, 'wb') as f:
#        for chunk in response.iter_content(chunk_size=128):
#            f.write(chunk)

print('done')
0
ответ дан martineau 24 March 2019 в 20:45
поделиться

Размещение моего ответа в соответствии с рекомендациями @martineau.

  1. Создайте библиотеку GIF, как показано здесь
  2. Выполните приведенный ниже код и дождитесь записи result.png на диск:
from PIL import Image
from platform import system
from ctypes import string_at, Structure, c_long as cl, c_ubyte, \
                   py_object, pointer, POINTER as PT, CFUNCTYPE, CDLL
import requests

class GIF_WHDR(Structure): _fields_ = \
   [("xdim", cl), ("ydim", cl), ("clrs", cl), ("bkgd", cl),
    ("tran", cl), ("intr", cl), ("mode", cl), ("frxd", cl), ("fryd", cl),
    ("frxo", cl), ("fryo", cl), ("time", cl), ("ifrm", cl), ("nfrm", cl),
    ("bptr", PT(c_ubyte)), ("cpal", PT(c_ubyte))]

def GIF_Load(lgif, file, size):
    def WriteFunc(d, w):
        list = d.contents.value
        if (len(list) == 0):
            list.append(Image.frombytes("L", (w[0].frxd, w[0].fryd),
                              string_at(w[0].bptr, w[0].frxd * w[0].fryd)))
            list[0].putpalette(string_at(w[0].cpal, w[0].clrs * 3))
    list = []
    lgif.GIF_Load(file, size,
                  CFUNCTYPE(None, PT(py_object), PT(GIF_WHDR))(WriteFunc),
                  None, pointer(py_object(list)), 0)
    return list

chunk = 32768
img = "wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif"

lgif = CDLL(("%s.so", "%s.dll")[system() == "Windows"] % "./gif_load")

size = -1
file = b""
response = requests.get("https://upload.wikimedia.org/" + img, stream = True)
if response.status_code != 200:
    print('Error:', response.status_code)
else:
    while size < len(file):
        size = len(file)
        file += response.raw.read(chunk)
        list = GIF_Load(lgif, file, len(file))
        if (len(list) == 1):
            list[0].save("result.png")
            break
    print("Read %d bytes\n" % len(file))

Имейте в виду, что это только иллюстративный пример; он не поддерживает многие вещи, присутствующие в современных GIF-файлах, такие как чередование и прозрачность. Полностью совместимую версию см. В примере из [1].

0
ответ дан hidefromkgb 24 March 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: