2009-08-25 23 views

Respuesta

0

No conozco ninguna forma de hacerlo en el lado del cliente, pero no estoy seguro de eso. Lo que podría hacer es analizar el código HTML y cualquier gif referenciado en el lado del servidor y agregar una clase a estas imágenes. Pero eso no se recomienda porque implica al menos un análisis adicional de HTML + de cada gif. Como puede ver en this example in PHP, comprobar los archivos .gif tampoco es trivial en términos de carga de la CPU.

+0

Estoy de acuerdo con Residuo, no creo que haya ninguna manera de hacer esto en javascript – Josh

+0

pensé, tal vez algo es posible con el Canvas-API. Simplemente muestree una imagen cada x milisegundos, y calcule un hash de la imagen. No es muy confiable, pero podría funcionar ... – doekman

14

Acabo de escribir algunos JS que detectan gifs animados. Funciona en la mayoría de los navegadores modernos excepto IE 9.

responsabilidad: esto sólo funciona si el origen del dominio de la imagen es la misma que la página que va a cargar el script desde.

Ver el quid de la última versión del código: 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

¿Qué pasa si todos los marcos tienen datos idénticos? Entonces el gif se detectará como animado mientras que en realidad no lo es. Una solución infalible (pero más costosa) sería comparar datos de marcos hasta encontrar dos realmente diferentes. – Gautam

+0

Buen punto @Gautam ¡Me gustaría ver una implementación si lo hace! – lakenen

+0

Jaja, no contenga la respiración :) Eso fue pensado como algo a considerar para alguien que esté pensando en usar esta función. No me preveo implementarlo en el corto plazo ... – Gautam

Cuestiones relacionadas