2009-09-11 10 views
11

यहां एक ही प्रोजेक्ट के बारे में पूछा गया है जिस पर मैं काम कर रहा हूं, another question का एक लिंक है। मुझे लगता है कि पृष्ठभूमि का थोड़ा सा सहायक होगा।मैं प्रोग्रामेटिक रूप से जांच कैसे करूं कि एक जीआईएफ छवि एनिमेटेड है या नहीं?

उन लोगों के लिए जो उस प्रश्न पर एक नया टैब खोलने के लिए बहुत आलसी हैं, मैं सारांशित करूँगा कि मैं यहां क्या करने की कोशिश कर रहा हूं: मैंने 4 एसक्रैप से लगभग 250,000 छवियां डाउनलोड की हैं और मैं जीआईएफ के माध्यम से जाना चाहता हूं और खोजें कि कौन से एनिमेटेड हैं या नहीं। मुझे यह प्रोग्रामेटिक रूप से करने की ज़रूरत है, क्योंकि मुझे वास्तव में मेरी आत्मा महसूस नहीं होती है (या मेरी प्रेमिका के साथ मेरा रिश्ता) 4chan से कुछ हज़ार जीआईएफ देखने के लिए देख सकता है कि वे एनिमेटेड हैं या नहीं। यदि आप 4chan की प्रकृति को जानते हैं, तो आप छवियों की प्रकृति (यानी "स्तन या जीटीएफओ") जानते हैं।

मुझे PHP और पायथन पता है, लेकिन अन्य समाधानों का पता लगाने के इच्छुक होंगे। विंडोज़ पर काम करने वाले सॉफ़्टवेयर का स्टैंड-अलोन टुकड़ा भी काम करेगा।

बहुत बहुत धन्यवाद!

+2

http://stackoverflow.com/questions/280658/can-i-detect-animated-gifs-using-php-and-gd देखें –

उत्तर

16
अजगर के साथ

और PIL:

from PIL import Image 
gif = Image.open('path.gif') 
try: 
    gif.seek(1) 
except EOFError: 
    isanimated = False 
else: 
    isanimated = True 
+0

यह बहुत अच्छा काम किया। धन्यवाद! –

+1

इस टिप के लिए धन्यवाद। छोटा नाइट: छवि को 0 पर वापस लेना महत्वपूर्ण हो सकता है, क्योंकि 'gif.tell() '' को छोड़कर 'ब्लॉक में भी 1 लौटाएगा, अगर मुझे गलत नहीं लगता है। – Ben

+0

यह वास्तव में 'getIteratorIndex'' के साथ बहुत आसान है http://php.net/manual/en/imagick.getiteratorindex.php – arghav

2

GIF89A विनिर्देश पढ़ें और जानकारी निकालें। http://www.w3.org/Graphics/GIF/spec-gif89a.txt

या एक हैक के लिए आसान और आलसी और तैयार इंटरजीफ प्रोग्राम का उपयोग करें जो एनिमेटेड gif से एकल छवियों को निकाल सकता है। एक अस्थायी निर्देशिका में निकालें और देखें कि आपको कितनी फाइलें मिलती हैं। http://utter.chaos.org.uk/~pdh/software/intergif/download.htm

3

कुछ समाधान imagecreatefromgif समारोह के लिए PHP docs पृष्ठ पर दिया जाता है।

मैंने जो समाधान पढ़े हैं, उससे यह एक कठिन स्मृति आवश्यकताओं के कारण सबसे अच्छा लगता है।

<?php 
function is_ani($filename) { 
    if(!($fh = @fopen($filename, 'rb'))) 
     return false; 
    $count = 0; 
    //an animated gif contains multiple "frames", with each frame having a 
    //header made up of: 
    // * a static 4-byte sequence (\x00\x21\xF9\x04) 
    // * 4 variable bytes 
    // * a static 2-byte sequence (\x00\x2C) 

    // We read through the file til we reach the end of the file, or we've found 
    // at least 2 frame headers 
    while(!feof($fh) && $count < 2) { 
     $chunk = fread($fh, 1024 * 100); //read 100kb at a time 
     $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches); 
    } 
    fclose($fh); 
    return $count > 1; 
} 
?> 
+0

चेतावनी! कोड के इस स्निपेट में एक बड़ी बग है। जबकि कथन में ब्रैकेट शामिल होना चाहिए, अन्यथा यह फ़ंक्शन सभी एनिमेटेड gifs को पकड़ नहीं पाएगा। हालांकि यह कुछ पकड़ लेगा (जो कि 100% की विफलता से अधिक है)। इस स्टैक ओवरफ्लो यूआरएल पर पूर्ण और निश्चित कोड देखें http://stackoverflow.com/questions/280658/can-i-detect-animated-gifs-using-php-and-gd – billmalarky

+0

असल में, यहां तक ​​कि एक नया संस्करण भी है यह स्क्रिप्ट जो फ़ोटोशॉप सीएस 5 एनिमेटेड gifs द्वारा संभावित रूप से बनाई गई बग को हल करती है। इसे देखें [यहां] (http://www.php.net/manual/en/function.imagecreatefromgif.php#104473) – billmalarky

+0

@ बिलमालकी मैंने जवाब – Kornel

7

मैंने कभी ऐसा प्रोग्राम नहीं देखा है जो आपको यह बताएगा। लेकिन जीआईएफ एक ब्लॉक संरचित प्रारूप है और आप जांच सकते हैं कि एनिमेटेड जीआईएफ इंगित करने वाला ब्लॉक आपकी फाइलों में मौजूद है या नहीं।

विकिपीडिया लेख से नीचे नोट किया गया: ऑफसेट 0x30D ऑफिस एक्सटेंशन (यानी: 3 बाइट जादू संख्या 21 एफएफ 0 बी) जीआईएफ फ़ाइल में ब्लॉक के बाद, जादू संख्या 4 ई 45 54 53 43 41 50 45 32 9एट ऑफसेट 0x310 इंगित करता है कि शेष फ़ाइल में कई छवियां हैं, और उन्हें एनिमेटेड होना चाहिए।

वास्तव में विकिपीडिया आलेख इसे बेहतर समझाता है और नीचे दिए गए प्रारूप दस्तावेज़ विकी आलेख पर विस्तारित हैं।

तो आप पाइथन में लिखे गए प्रोग्राम का उपयोग करके जीआईएफ का विश्लेषण कर सकते हैं (मैंने कई वर्षों पहले सी का उपयोग करके जीआईएफ का विश्लेषण किया था, यह मुख्य रूप से फाइल पॉइंटर को चारों ओर और बाइट पढ़ने में एक अभ्यास था)। यह निर्धारित करें कि एई सही 3 बाइट आईडी के साथ मौजूद है, और इसके बाद 9 बाइट जादू संख्या है।

देखें http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_.gif

भी देखें http://www.martinreddy.net/gfx/2d/GIF87a.txt

भी देखें http://www.martinreddy.net/gfx/2d/GIF89a.txt

क्षमा करें, सबसे अच्छा मैं तुम्हारे लिए क्या कर सकते हैं।

1

मैं कोई जीआईएफ फ़ाइल प्रारूप विशेषज्ञ नहीं हूं, लेकिन यह मेरे लिए एक दिलचस्प समस्या है इसलिए मैंने इसे थोड़ा सा देखा। यह केवल तभी काम करेगा जब यह हमेशा सच है कि एनिमेटेड gifs के पास स्थिति 0x310 (संपादित करें) पर स्थिर NETSCAPE2.0 है और स्थैतिक gifs नहीं है, (/ संपादित करें) जो मेरी परीक्षण फ़ाइलों में मामला था।यह सी # है, यदि आप चाहते हैं कि मैं इसे एक कंसोल ऐप में संकलित कर सकता हूं जो एक निर्देशिका को तर्क के रूप में लेता है और आप अपने बहुत बड़े gif संग्रह पर कुछ परीक्षण चला सकते हैं यह देखने के लिए कि यह विश्वसनीय परिणाम उत्पन्न करता है या नहीं।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using System.IO; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string ani = @"C:\path\to\ani.gif"; 
      string sta = @"C:\path\to\static.gif"; 

      Console.WriteLine(isAnimated(ani)); 
      Console.WriteLine(isAnimated(sta)); 
     } 

     static bool isAnimated(string path) 
     { 
      byte[] bytes = File.ReadAllBytes(path); 
      byte[] netscape = bytes.Skip(0x310).Take(11).ToArray(); 

      StringBuilder sb = new StringBuilder(); 

      foreach (var item in netscape) 
      { 
       sb.Append((char)item); 
      } 

      return sb.ToString() == "NETSCAPE2.0"; 
     } 
    } 
} 
13

आप लिनक्स पर कर रहे हैं (या ImageMagick के साथ किसी भी प्रणाली) आप एक लाइनर खोल स्क्रिप्ट और identify प्रोग्राम का उपयोग कर सकते हैं:

identify *.gif | fgrep '.gif[1] ' 

मैं जानता हूँ कि आप ने कहा आप PHP और अजगर पसंद करते हैं, लेकिन आपने यह भी कहा कि आप अन्य समाधानों का पता लगाने के इच्छुक हैं। :)

0

कोशिश इस

import Image 

def checkAnimate(): 
    im = Image.open('image.gif') 
    if not im.info['version'].__contains__('GIF'): 
     print "It's not a GIF file" 
    else: 
     if im.info.has_key('duration'): 
      if im.info['duration'] > 0: 
       return True 
      else: 
       return False 
     else: 
      return False 
1

अगर वहाँ एक से अधिक LocalDescriptor GIF फ़ाइल में कर रहे हैं वहाँ देखते हैं।

+1

कृपया अपना उत्तर विस्तृत करें। यह एक टिप्पणी की तरह है। –

0
from PIL import Image 
fp = open('1.gif', 'rb') 
im = Image.open(fp) 
is_gif = bool(im.format and im.format.upper() == 'GIF') 
+0

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, _why_ और/या _how_ के बारे में अतिरिक्त संदर्भ का उत्तर देता है, यह प्रश्न इसके दीर्घकालिक मान में काफी सुधार करेगा। कुछ स्पष्टीकरण जोड़ने के लिए कृपया अपना उत्तर संपादित करें। –

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