2011-09-21 61 views
5

GIFフレーム番号を取得するためのいくつかの種類のメソッドを探しています。私はGoogle、stackoverflowと任意の外出先のサイトを探していると私はごみだけを見つける!誰かがそれを行う方法を知っていますか?私は単純な数のGIFフレームしか必要としません。Python、GIFフレームを取得する方法

答えて

10

フレームのロード/操作にはどの方法を使用していますか? PILを使用していますか?そうでない場合は、Python Imaging Libraryと具体的にはthe PIL gif pageを確認することをおすすめします。

ここでは、gifで読み込むためにPILを使用していると仮定して、見ているフレームを判断するのはかなり単純です。 シークは、特定のフレームに行き、と言うと、はあなたが見ているフレームを返します。

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

だけでファイルを解析し、GIFファイルは非常に単純です:

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が返されました...(プレビューを使ってフレームを数えました。 ... 250030以上の画像に関する情報)... – Zizouz212

+1

@ Zizouz212:これは私の[私の答え](http://stackoverflow.com/a/28549748/355230)で使用された 'small_globe.gif'テストファイルで私にとってはうまくいったあなたの質問。あなたの44フレームのGIF画像ファイルをあなたの質問のようにどこかにアップロードして、私にダウンロードして問題の原因を突き止めることができるかどうかを知らせてください。 – martineau

関連する問題