2011-09-21 6 views
5

ben gif numarasını çerçeveleri almak için bir çeşit yöntemi arıyorum. google, stackoverflow ve herhangi bir outher siteleri arıyorum ve sadece çöp buluyorum! Birisi nasıl yapılacağını biliyor mu? Sadece basit gif karelerine ihtiyacım var.Python, ben nasıl alabilirim gif çerçeveleri

cevap

10

hangi metodu çerçeve/yük işlemek için kullanıyorsunuz? PIL kullanıyor musunuz? Değilse, kontrol etmenizi öneririm: Python Imaging Library ve özellikle the PIL gif page.

Şimdi, gif okumak için PIL kullandığınız varsayarak, bu bakıyorsun hangi çerçeve belirlemek için oldukça basit bir mesele. belirli bir kareye gidecek ve bakıyorsun hangi çerçeve dönecektir söylemek ararlar.

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 

Aksi takdirde, ben sadece bir istisna (EOFError) yükseltilir kadar arayarak gif olarak kare sayısını bulabilirsiniz inanıyoruz.

+0

ben son Yastık sürümüne sahip tahmin ediyorum (o iş yapmak "PIL ithalat Image" içine "ithal Image" değiştirmek zorunda yüklü) – sellibitze

12

Sadece dosyayı ayrıştırmak, gif oldukça basit:

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

Bu PIL gerektirir farz ediyorum, ben 44 kare 'gif' kayıtlı bu kullanarak denedim ve ben Önizleme kullanarak çerçeveleri sayılır ama bana almak için bazı kod gerekir (... üzerimde 0 döndü 2500 görüntülerin) ... – Zizouz212

+1

Zizouz212 @ info: Bu diğerine [cevabım] (http://stackoverflow.com/a/28549748/355230) kullanılan 'small_globe.gif' testi dosyası ile benim için çalıştı seninki sorusu. Lütfen 44 kare GIF resim dosyasını bir yere (sorularınızda olduğu gibi) yükleyin ve bana bildirin, böylece onu indirebilir ve sorunun nedenini anlayabilir miyim diye bakalım. – martineau