【问题标题】:How to count how many times an animated gif loops and display that count in javascript?如何计算动画 gif 循环的次数并在 javascript 中显示该计数?
【发布时间】:2026-01-04 06:45:01
【问题描述】:

有没有办法显示动画 gif 循环的次数?例如,您登陆一个带有动画 gif 的页面,当该 gif 完全循环其动画一次时,将显示 1。每次 gif 完全循环时,该数字都会增加 1。永远。

感谢您的任何见解!

【问题讨论】:

    标签: javascript gif animated-gif


    【解决方案1】:

    我计算 gif 的持续时间,然后 setInterval。 我的 gif 有 15 秒长。

    const gif = document.getElementById("gif");
        gifLoopCounterInit(gif.src);
        function gifLoopCounterInit(fileSrc) {
            var request = new XMLHttpRequest();
            request.open('GET', fileSrc, true);
            request.responseType = 'arraybuffer';
            request.addEventListener('load', async function () {
                calcDurationGif(request.response).then(function (duration) {
                    const loopCounter = document.getElementById("loop-counter");
                    setInterval(function () {
                        loopCounter.innerHTML++;
                    }, duration * 1000);
                });
            });
            request.send();
        }
        function calcDurationGif(file) {
            return new Promise((resolve, reject) => {
                try {
                    let arr = new Uint8Array(file);
                    let duration = 0;
                    for (var i = 0; i < arr.length; i++) {
                        if (arr[i] == 0x21
                            && arr[i + 1] == 0xF9
                            && arr[i + 2] == 0x04
                            && arr[i + 7] == 0x00) {
                            const delay = (arr[i + 5] << 8) | (arr[i + 4] & 0xFF)
                            duration += delay < 2 ? 10 : delay;
                        }
                    }
    
                    console.log(duration / 100);
                    resolve(duration / 100);
                } catch (e) {
                    reject(e);
                }
            });
        }
    <img id="gif" src="https://c.tenor.com/AeFQKHQFFq8AAAAd/gif-art.gif" alt="">
        <p>Loops : <span id="loop-counter">0</span> </p>

    【讨论】: