2009-08-25 4 views

Répondre

0

Je ne connais aucun moyen de le faire du côté client, mais je ne suis pas sûr de cela. Ce que vous pouvez faire, c'est analyser le code HTML et tout gif référencé du côté serveur et ajouter une classe à ces images. Mais ce n'est pas vraiment recommandé car cela implique au moins une analyse supplémentaire de l'analyse HTML + de chaque gif. Comme vous pouvez le voir de this example in PHP, la vérification des gifs n'est pas non plus triviale en termes de charge CPU.

+0

Je suis d'accord avec Résidu, je ne pense pas qu'il y ait une façon de le faire en javascript – Josh

+0

je pensais, peut-être quelque chose est possible avec le Canvas-API. Echantillonnez une image toutes les x millisecondes et calculez un hachage de l'image. Pas trop fiable, mais ça pourrait marcher ... – doekman

14

Je viens d'écrire quelques JS qui détectent les gifs animés. Fonctionne dans la plupart des navigateurs modernes, sauf IE 9.

Avertissement: cela ne fonctionne que si l'origine du domaine de l'image est la même que la page que vous chargez le script.

Voir l'essentiel de la dernière version du code: 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

Et si toutes les images avaient des données identiques? Alors le gif sera détecté comme étant animé alors qu'en réalité ce n'est pas le cas. Une solution infaillible (mais plus coûteuse) consisterait à comparer les données de la trame jusqu'à ce que vous en trouviez deux qui diffèrent réellement. – Gautam

+0

Bon point @Gautam Je serais intéressé de voir une implémentation si vous le faites! – lakenen

+0

Haha, ne retenez pas votre souffle :) Cela a été considéré comme quelque chose à considérer pour quelqu'un qui pense à utiliser cette fonction. Je ne prévois pas de l'implémenter de sitôt ... – Gautam