2011-09-21 57 views
5

我正在尋找一些有用的方法來獲得GIF幀數。我正在尋找谷歌,stackoverflow和任何outher網站,我只找到垃圾!有人知道如何做到這一點?我只需要簡單數量的gif幀。Python,我怎麼可以得到GIF幀

回答

10

您使用哪種方法來加載/操作框架?你在使用PIL嗎?如果不是,我建議檢查一下:Python Imaging Library,特別是the PIL gif page

現在,假設您使用PIL來讀取gif,確定您正在查看的幀是一件非常簡單的事情。 查詢將轉到特定的框架,並且告訴將返回您正在查看的框架。

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 

否則,我相信你只能通過尋求到一個異常(引發EOFError)提高發現在GIF的幀數。

+0

我不得不改變「導入圖片」變成「從PIL導入圖片」,使其工作(我猜我有最新版本的枕頭安裝) – sellibitze

12

只是解析文件,圖檔是非常簡單的:

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

我假設這需要PIL,我試圖在44幀'gif'文件上使用它,並且它在我身上返回0 ...(我使用Preview來計算幀,但是我需要一些代碼才能使我超過2500張圖片的信息)... – Zizouz212

+1

@ Zizouz212:這對我的'small_globe.gif'測試文件,我在[我的答案](http://stackoverflow.com/a/28549748/355230)用於另一個你的問題。請將您的44幀gif圖像文件上傳到某處(例如您的其中一個問題),然後讓我知道,以便我可以下載它並查看是否可以找出造成問題的原因。 – martineau