2011-09-21 15 views
5

मैं gif फ्रेम संख्या प्राप्त करने के लिए किसी तरह की विधि देख रहा हूं। मैं google, stackoverflow और किसी भी बाहरी साइट पर देख रहा हूं और मुझे केवल बकवास मिल रहा है !! किसी को पता है कि यह कैसे करें? मुझे केवल gif फ्रेम की सरल संख्या की आवश्यकता है।पायथन, मैं gif फ्रेम कैसे प्राप्त कर सकता हूं

उत्तर

10

फ्रेम को लोड/हेरफेर करने के लिए आप किस विधि का उपयोग कर रहे हैं? क्या आप पीआईएल का उपयोग कर रहे हैं? यदि नहीं, तो मैं इसे जांचने का सुझाव देता हूं: Python Imaging Library और विशेष रूप से the PIL gif page

अब, मान लीजिए कि आप जीआईएफ में पढ़ने के लिए पीआईएल का उपयोग कर रहे हैं, यह निर्धारित करने के लिए एक बहुत ही साधारण बात है कि आप कौन सी फ्रेम देख रहे हैं। एक विशिष्ट फ्रेम पर जाएं और बताएं आप जिस फ्रेम को देख रहे हैं उसे वापस कर देगा।

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

मैं में "से जनहित याचिका आयात छवि" बदलने के लिए "आयात छवि" यह काम करने के लिए (मैं मैं हाल ही में एक तकिया संस्करण है अनुमान लगा रहा हूँ था स्थापित) – 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

मुझे लगता है कि इसे पीआईएल की आवश्यकता है, मैंने 44 फ्रेम 'gif' फ़ाइल पर इसका उपयोग करने की कोशिश की, और यह मेरे पास 0 लौटा ... (मैंने पूर्वावलोकन का उपयोग करके फ्रेम की गणना की, लेकिन मुझे कुछ कोड चाहिए 2500 से अधिक छवियों पर जानकारी) ... – Zizouz212

+1

@ ज़ीज़ौज़ 212: यह मेरे लिए [small_globe.gif' परीक्षण फ़ाइल के साथ काम करता था जिसका उपयोग मैंने [मेरे उत्तर] (http://stackoverflow.com/a/28549748/355230) में किया था तुम्हारा सवाल कृपया अपनी 44 फ्रेम gif छवि फ़ाइल को कहीं भी अपलोड करें (जैसे आपके किसी एक प्रश्न में), और फिर मुझे बताएं ताकि मैं इसे डाउनलोड कर सकूं और देख सकूं कि क्या समस्या का कारण बन रहा है या नहीं। – martineau

संबंधित मुद्दे

 संबंधित मुद्दे