2011-09-21 23 views
5

Tôi đang tìm kiếm một số loại phương pháp để có được số khung gif. tôi đang tìm kiếm trên google, stackoverflow và bất kỳ trang web outher và tôi chỉ tìm thấy rác !! Ai đó biết làm thế nào để làm điều đó? tôi chỉ cần số khung hình gif đơn giản.Python, làm thế nào tôi có thể nhận được khung hình gif

Trả lời

10

Bạn đang sử dụng phương pháp nào để tải/thao tác khung? Bạn đang sử dụng PIL? Nếu không, tôi khuyên bạn nên kiểm tra: Python Imaging Library và cụ thể là the PIL gif page.

Bây giờ, giả sử bạn đang sử dụng PIL để đọc trong gif, đó là một vấn đề khá đơn giản để xác định khung bạn đang xem. tìm kiếm sẽ chuyển đến một khung cụ thể và yêu cầu sẽ trả về khung bạn đang xem.

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 

Nếu không, tôi tin rằng bạn chỉ có thể tìm số khung trong gif bằng cách tìm kiếm cho đến khi ngoại lệ (EOFError) được nâng lên.

+0

tôi đã phải thay đổi "Hình ảnh nhập khẩu" vào "từ PIL nhập khẩu Hình ảnh" để làm cho nó hoạt (Tôi đoán tôi có một phiên bản gần đây Gối cài đặt) – sellibitze

12

Chỉ cần phân tích các tập tin, gif là khá đơn giản:

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

Tôi giả sử điều này yêu cầu PIL, tôi đã thử sử dụng tệp này trên một tệp 44 gif', và nó trả về 0 cho tôi ... (Tôi đã đếm các khung bằng cách sử dụng Xem trước, nhưng tôi cần một số mã để giúp tôi thông tin trên hơn 2500 hình ảnh) ... – Zizouz212

+1

@ Zizouz212: Điều này làm việc cho tôi với tệp kiểm tra 'small_globe.gif' tôi đã sử dụng trong [answer] (http://stackoverflow.com/a/28549748/355230) của mình cho một tệp khác câu hỏi của bạn. Vui lòng tải lên 44 tệp hình ảnh gif của bạn ở đâu đó (như trong một trong các câu hỏi của bạn), sau đó cho tôi biết để tôi có thể tải xuống và xem liệu tôi có thể tìm ra nguyên nhân gây ra sự cố không. – martineau

Các vấn đề liên quan