You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
/**
|
|
|
|
* @returns duration in ms
|
|
|
|
*/
|
|
|
|
export default function getGifDuration(image: HTMLImageElement) {
|
|
|
|
const src = image.src;
|
|
|
|
|
|
|
|
return fetch(src)
|
|
|
|
.then((response) => response.arrayBuffer())
|
|
|
|
.then((arrayBuffer) => {
|
|
|
|
const d = new Uint8Array(arrayBuffer);
|
|
|
|
// Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/
|
|
|
|
// And http://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
|
|
|
let duration = 0;
|
|
|
|
for(let i = 0, length = d.length; i < length; ++i) {
|
|
|
|
// Find a Graphic Control Extension hex(21F904__ ____ __00)
|
|
|
|
if(d[i] == 0x21
|
|
|
|
&& d[i + 1] == 0xF9
|
|
|
|
&& d[i + 2] == 0x04
|
|
|
|
&& d[i + 7] == 0x00) {
|
|
|
|
// Swap 5th and 6th bytes to get the delay per frame
|
|
|
|
const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);
|
|
|
|
|
|
|
|
// Should be aware browsers have a minimum frame delay
|
|
|
|
// e.g. 6ms for IE, 2ms modern browsers (50fps)
|
|
|
|
duration += delay < 2 ? 10 : delay;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return duration / 1000;
|
|
|
|
});
|
|
|
|
}
|