最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Is it possible to detect animated gif images client side? - Stack Overflow

programmeradmin4浏览0评论

Is it possible to detect animated gif images client side?

In Internet Explorer you can use the onload event for this, since it willl be fired for every frame loaded (behaviour changed in IE8).

But is there a way for other browsers too?

Is it possible to detect animated gif images client side?

In Internet Explorer you can use the onload event for this, since it willl be fired for every frame loaded (behaviour changed in IE8).

But is there a way for other browsers too?

Share Improve this question asked Aug 25, 2009 at 8:40 doekmandoekman 19.3k20 gold badges69 silver badges87 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 15

I just wrote some JS that detects animated gifs. Works in most modern browsers except IE 9.

Disclaimer: this only works if the domain origin of the image is the same as the page you are loading the script from.

See the gist for the latest version of the 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();
}

I don't know of any way to do it on the client side, but I am not sure about that. What you could do, is parsing the HTML code and any referenced gif on the server side and add a class to these images. But that is not really recommended because it involves at least one additional parsing of HTML + parsing of every gif. As you can see from this example in PHP, checking the gifs is also not trivial in terms of CPU load.

发布评论

评论列表(0)

  1. 暂无评论