2009-08-25 21 views

risposta

0

Non so in alcun modo di farlo dal lato client, ma non ne sono sicuro. Quello che potresti fare, è analizzare il codice HTML e qualsiasi gif di riferimento sul lato server e aggiungere una classe a queste immagini. Ma questo non è veramente raccomandato perché implica almeno un ulteriore parsing di analisi HTML + di ogni gif. Come puoi vedere da this example in PHP, anche il controllo dei gif non è banale in termini di carico della CPU.

+0

Sono d'accordo con Residuum, non credo che ci sia alcun modo per fare questo in javascript – Josh

+0

ho pensato, forse qualcosa è possibile con la tela-API. Basta campionare un'immagine ogni x millisecondi e calcolare un hash dell'immagine. Non troppo affidabile, ma potrebbe funzionare ... – doekman

14

Ho appena scritto un JS che rileva le gif animate. Funziona nella maggior parte dei browser moderni tranne IE 9.

Disclaimer: funziona solo se l'origine del dominio dell'immagine è uguale alla pagina da cui si sta caricando lo script.

Vedere il succo per l'ultima versione del codice: 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

Cosa succede se tutti i frame hanno dati identici? Quindi la gif verrà rilevata come animata mentre in realtà non lo è. Una soluzione infallibile (ma più costosa) sarebbe quella di confrontare effettivamente i dati del frame fino a trovare due che effettivamente differiscono. – Gautam

+0

Buon punto @ Gautam Sarei interessato a vedere un'implementazione se lo fai! – lakenen

+0

Haha, non trattenere il respiro :) Questo è stato pensato come qualcosa da considerare per qualcuno che pensa di usare questa funzione. Non mi aspetto di implementarlo in qualunque momento presto ... – Gautam

Problemi correlati