2009-08-25 8 views
16

एनिमेटेड gif छवियों क्लाइंट पक्ष का पता लगाना संभव है?एनिमेटेड gif छवियों क्लाइंट पक्ष का पता लगाना संभव है?

इंटरनेट एक्सप्लोरर में आप onload ईवेंट का उपयोग कर सकते हैं, क्योंकि इसे every frame loaded (IE8 में व्यवहार बदल दिया गया) के लिए निकाल दिया जाएगा।

लेकिन क्या अन्य ब्राउज़रों के लिए भी कोई तरीका है?

उत्तर

0

मुझे क्लाइंट पक्ष पर ऐसा करने का कोई तरीका नहीं पता, लेकिन मुझे इसके बारे में निश्चित नहीं है। आप क्या कर सकते हैं, एचटीएमएल कोड और सर्वर पक्ष पर किसी भी संदर्भित gif को पार्स कर रहा है और इन छवियों में एक वर्ग जोड़ रहा है। लेकिन इसकी वास्तव में अनुशंसा नहीं की जाती है क्योंकि इसमें प्रत्येक gif के HTML + पार्सिंग की कम से कम एक अतिरिक्त पार्सिंग शामिल है। जैसा कि आप this example in PHP से देख सकते हैं, सीपीयू लोड के संदर्भ में gifs को जांचना भी छोटा नहीं है।

+0

मैं अवशेष से सहमत हैं, मैं वहाँ में जावास्क्रिप्ट – Josh

+0

मैंने सोचा था कि यह करने के लिए किसी भी तरह से है नहीं लगता है, हो सकता है कुछ के साथ संभव है कैनवास-एपीआई। बस प्रत्येक एक्स मिलीसेकंड छवि को नमूना दें, और छवि के हैश की गणना करें। बहुत विश्वसनीय नहीं है, लेकिन यह काम कर सकता है ... – doekman

14

मैंने कुछ जेएस लिखा है जो एनिमेटेड gifs का पता लगाता है। IE 9 को छोड़कर अधिकांश आधुनिक ब्राउज़रों में काम करता है।

अस्वीकरण: यह केवल तभी काम करता है जब छवि की मूल उत्पत्ति उस पृष्ठ के समान होती है जिस पर आप स्क्रिप्ट लोड कर रहे हैं।

कोड के नवीनतम संस्करण के लिए सार देखें: https://gist.github.com/3012623

function isAnimatedGif(src, cb) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', src, true); 
    request.responseType = 'arraybuffer'; 
    request.addEventListener('load', function() { 
     var arr = new Uint8Array(request.response), 
      i, len, length = arr.length, frames = 0; 

     // make sure it's a gif (GIF8) 
     if (arr[0] !== 0x47 || arr[1] !== 0x49 || 
      arr[2] !== 0x46 || arr[3] !== 0x38) 
     { 
      cb(false); 
      return; 
     } 

     //ported from php http://www.php.net/manual/en/function.imagecreatefromgif.php#104473 
     //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) (some variants may use \x00\x21 ?) 
     // We read through the file til we reach the end of the file, or we've found 
     // at least 2 frame headers 
     for (i=0, len = length - 9; i < len, frames < 2; ++i) { 
      if (arr[i] === 0x00 && arr[i+1] === 0x21 && 
       arr[i+2] === 0xF9 && arr[i+3] === 0x04 && 
       arr[i+8] === 0x00 && 
       (arr[i+9] === 0x2C || arr[i+9] === 0x21)) 
      { 
       frames++; 
      } 
     } 

     // if frame count > 1, it's animated 
     cb(frames > 1); 
    }); 
    request.send(); 
} 
+0

क्या होगा यदि सभी फ्रेमों में समान डेटा है? फिर gif को एनिमेटेड होने के रूप में पहचाना जाएगा जबकि वास्तव में यह नहीं है। एक मूर्खतापूर्ण (लेकिन अधिक महंगा) समाधान वास्तव में फ्रेम डेटा की तुलना करना होगा जबतक कि आप दो को वास्तव में अलग न करें। – Gautam

+0

अच्छा बिंदु @ गौतम मुझे एक कार्यान्वयन देखने में दिलचस्पी होगी यदि आप करते हैं! – lakenen

+0

हाहा, अपनी सांस न पकड़ें :) यह इस फ़ंक्शन का उपयोग करने के बारे में सोचने वाले किसी व्यक्ति के लिए विचार करने के लिए कुछ था। मैं खुद को किसी भी समय इसे लागू करने की पूर्ववत नहीं करता ... – Gautam

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