Подтвердить что ты не робот

Можно ли обнаружить анимированную gif-картинку на стороне клиента?

Можно ли обнаружить анимированную gif-картинку на стороне клиента?

В Internet Explorer вы можете использовать событие onload для этого, так как он будет запущен для каждый загруженный фрейм (поведение, измененное в IE8).

Но есть ли способ для других браузеров?

4b9b3361

Ответ 1

Я не знаю, как это сделать на стороне клиента, но я не уверен в этом. Что вы можете сделать, это разбор кода HTML и любого связанного gif на стороне сервера и добавление класса к этим изображениям. Но это не рекомендуется, потому что он включает по крайней мере один дополнительный синтаксический разбор HTML + разбора каждого gif. Как вы можете видеть из этот пример в PHP, проверка gif также не является тривиальной с точки зрения загрузки процессора.

Ответ 2

Я просто написал несколько JS, которые обнаруживают анимированные gif. Работает в большинстве современных браузеров, кроме IE 9.

Отказ от ответственности: это работает только в том случае, если источник домена изображения совпадает со страницей, с которой вы загружаете script.

Посмотрите суть последней версии кода: 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 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 animated
        cb(frames > 1);
    });
    request.send();
}