2011-09-21 10 views
5

Szukam jakiejś metody, aby uzyskać liczbę klatek gif. patrzę na google, stackoverflow i wszelkie inne strony i znajduję tylko śmieci !! Ktoś wie, jak to zrobić? Potrzebuję tylko prostej liczby ramek GIF.Python, jak mogę uzyskać ramki GIF

Odpowiedz

10

Którą metodę używasz do ładowania/manipulowania ramką? Czy korzystasz z PIL? Jeśli nie, sugeruję sprawdzenie: Python Imaging Library, a konkretnie the PIL gif page.

Teraz, zakładając, że używasz PIL do czytania w gifie, łatwo jest określić, na którą ramkę patrzysz. poszukaj przejdzie do konkretnej ramki i powiedz zwróci ramkę, którą przeglądasz.

import Image 
im = Image.open("animation.gif") 

# To iterate through the entire gif 
try: 
    while 1: 
     im.seek(im.tell()+1) 
     # do something to im 
except EOFError: 
    pass # end of sequence 

W przeciwnym razie, uważam, że można tylko znaleźć liczbę ramek w gif szukając aż wyjątek (EOFError) jest podniesiona.

+0

musiałem zmienić „Importuj obraz” do „z PIL import obrazu”, aby to działało (zgaduję Mam najnowszą wersję Pillow zainstalowany) – sellibitze

12

Wystarczy przeanalizować plik, gify są dość proste:

class GIFError(Exception): pass 

def get_gif_num_frames(filename): 
    frames = 0 
    with open(filename, 'rb') as f: 
     if f.read(6) not in ('GIF87a', 'GIF89a'): 
      raise GIFError('not a valid GIF file') 
     f.seek(4, 1) 
     def skip_color_table(flags): 
      if flags & 0x80: f.seek(3 << ((flags & 7) + 1), 1) 
     flags = ord(f.read(1)) 
     f.seek(2, 1) 
     skip_color_table(flags) 
     while True: 
      block = f.read(1) 
      if block == ';': break 
      if block == '!': f.seek(1, 1) 
      elif block == ',': 
       frames += 1 
       f.seek(8, 1) 
       skip_color_table(ord(f.read(1))) 
       f.seek(1, 1) 
      else: raise GIFError('unknown block type') 
      while True: 
       l = ord(f.read(1)) 
       if not l: break 
       f.seek(l, 1) 
    return frames 
+0

Zakładam, że to wymaga PIL, próbowałem użyć tego na 44 pliku 'gif' pliku, a on zwrócił 0 na mnie ... (policzyłem klatki używając podglądu, ale potrzebuję jakiegoś kodu, aby uzyskać info na ponad 2500 zdjęć) ... – Zizouz212

+1

@ Zizouz212: To działało dla mnie z plikiem testowym 'small_globe.gif', którego użyłem w [moja odpowiedź] (http://stackoverflow.com/a/28549748/355230) do innego Twoje pytanie. Załaduj gdzieś plik obrazu gif o 44 klatce (jak w jednym z twoich pytań), a następnie daj mi znać, abym mógł go pobrać i sprawdzić, czy mogę ustalić przyczynę problemu. – martineau

Powiązane problemy