admin管理员组文章数量:1287527
I tried to show gif only one time. So I used this code to achieve this.
var ui_img = document.getElementById("ui_image");
ui_img.hidden = false;
setTimeout(function () {
ui_img.hidden = true;
}, 8000);
But I knew the all gifs do not have the same duration. How can I solve this?
I tried to show gif only one time. So I used this code to achieve this.
var ui_img = document.getElementById("ui_image");
ui_img.hidden = false;
setTimeout(function () {
ui_img.hidden = true;
}, 8000);
But I knew the all gifs do not have the same duration. How can I solve this?
Share Improve this question asked Oct 14, 2021 at 1:39 Dapp ComposerDapp Composer 1981 gold badge2 silver badges12 bronze badges3 Answers
Reset to default 5You could try using this library gifuct-js.
Mainly use parseGIF()
, then depressFrames()
to get an array of frames each having the property delay
: the amount of time the frame is shown. So, you could sum up all the frame delays to get the total duration of a GIF image.
Usage example - Modified code sample from its Github page:
import { parseGIF, depressFrames } from 'gifuct-js'
var oReq = new XMLHttpRequest();
oReq.open("GET", gifURL, true);
oReq.responseType = "arraybuffer";
oReq.onload = function (oEvent) {
var arrayBuffer = oReq.response; // Note: not oReq.responseText
if (arrayBuffer) {
var gif = parseGIF(arrayBuffer);
var frames = depressFrames(gif, true);
// do something with the frame data
// get total time in ms
var totalTime = frames
.map(frame => frame.delay)
.reduce((a, b) => a + b);
}
};
oReq.send(null);
If i could improve upon @Alex code i would have made it Sync instead and more generaled purpose to work with mostly any source and not lock it into only working with only files (and also avoiding long unnecessary promise chains)
I would only accept a Uint8array
that could have a byte offset and being part of a larger zip file or something...
That way it can work with eg NodeJS filesystem & fetch
too.
I would also have used blob.arrayBuffer()
instead of using the legacy FileReader
fetch('https://media0.giphy./media/FIHThOlkZK3r8HTj9t/giphy.gif')
.then(res => res.arrayBuffer())
.then(ab => isGifAnimated(new Uint8Array(ab)))
.then(console.log)
/** @param {Uint8Array} uint8 */
function isGifAnimated (uint8) {
let duration = 0
for (let i = 0, len = uint8.length; i < len; i++) {
if (uint8[i] == 0x21
&& uint8[i + 1] == 0xF9
&& uint8[i + 2] == 0x04
&& uint8[i + 7] == 0x00)
{
const delay = (uint8[i + 5] << 8) | (uint8[i + 4] & 0xFF)
duration += delay < 2 ? 10 : delay
}
}
return duration / 100
}
This will return duration value
isGifAnimated(file) {
return new Promise((resolve, reject) => {
try {
let fileReader = new FileReader();
fileReader.readAsArrayBuffer(file);
fileReader.onload = (event) => {
let arr = new Uint8Array(fileReader.result);
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;
}
}
resolve(duration / 100);
}
} catch (e) {
reject(e);
}
});
}
本文标签: How to get duration of gif image in JavaScriptStack Overflow
版权声明:本文标题:How to get duration of gif image in JavaScript - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741314003a2371808.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论