2011-09-21 4 views
5

GIF 프레임 번호를 얻는 방법을 찾고 있습니다. 나는 google, stackoverflow 및 기타 외주 사이트를 찾고 있는데 쓰레기 만 찾는다 !! 누군가 그것을하는 방법을 알고 있습니까? 나는 gif 프레임의 간단한 숫자 만 필요합니다.파이썬, 어떻게 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

그냥 파일을 구문 분석, 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을 돌려 주었다 ... (나는 Preview를 사용하여 프레임을 세었지만, ... 250030 이상의 이미지에 관한 정보) ... – Zizouz212

+1

@ Zizouz212 : 이것은 [내 대답] (http://stackoverflow.com/a/28549748/355230)에서 다른 곳으로 사용한 'small_globe.gif'테스트 파일로 나를 위해 일했습니다. 너의 질문. 44 프레임짜리 gif 이미지 파일을 어딘가에 (예 : 질문 중 하나처럼) 업로드 한 다음 알려 주시면 다운로드하여 문제의 원인을 파악할 수 있는지 확인하십시오. – martineau

관련 문제