首页 > 其他分享 >ImageDecoder 获取GIF动图帧数

ImageDecoder 获取GIF动图帧数

时间:2024-04-11 14:36:33浏览次数:23  
标签:const gif ImageDecoder newImg GIF blob file res 动图

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ImageDecoder</title>
  </head>
  <body>
    <h3 id="frame"></h3>
    <input type="file" onchange="selectImg(event)" />
    <img src="http://localhost:14909/ji.gif" alt="" id="img" />
    <script>
      const img = document.getElementById('img');

      // fetch('http://localhost:14909/ji.gif').then(async (res) => {
      //   // console.log("res => ", await res.body)
      //   // getFPS(res.body);

      //   const newImg = document.createElement('img');
      //   newImg.src = 'http://localhost:14909/ji.gif';
      //   newImg.crossOrigin = 'cors';
      //   newImg.onload = () => {
      //     const canvas = document.createElement('canvas');
      //     const ctx = canvas.getContext('2d');
      //     canvas.width = newImg.width;
      //     canvas.height = newImg.height;
      //     ctx.drawImage(newImg, 0, 0, newImg.width, newImg.height);
      //     // canvas.toBlob((blob) => {
      //     //   console.log("blob => ", blob)
      //     //   getFPS(blob.stream());
      //     // }, 'image/gif', 1);

      //     // canvas.toBlob((blob) => {
      //     //   console.log("blob => ", blob)
      //     // }, 'image/gif', 1)
      //     canvas.toBlob(
      //       (blob) => {
      //         const file = new File([blob], 'ji.gif', { type: 'image/gif' });
      //         console.log(file);
      //         const img = new Image()
      //         img.src = URL.createObjectURL(file)
      //         img.onload = () => {
      //           document.body.appendChild(img)
      //         }
      //         // getFPS(file.stream());
      //         // 将file对象传递给需要使用它的函数
      //       },
      //       'image/gif',
      //       1
      //     );
      //   };
      //   // getFPS(file.stream());
      // });

      function selectImg(e) {
        /** @type {File} file */
        const file = e.target.files[0];
        const blob = new Blob([file]);

        // const url = URL.createObjectURL(blob);
        // fetch(url).then((res) => {
        //   getFPS(res.body);
        //   URL.revokeObjectURL(url);
        // });

        // getFPS(blob.stream());

        getFPS(file.stream())
      }

      async function getFPS(data) {
        let isSupport = await ImageDecoder.isTypeSupported("image/gif");
        if (!isSupport) throw new SyntaxError('暂不支持')

        const imageDecoder = new ImageDecoder({
          // data: buf,
          // data: res.body,
          data,
          type: 'image/gif',
        });

        console.log('imageDecoder => ', imageDecoder);

        // 获取GIF的第一帧图形数据
        // imageDecoder.decode({ frameIndex: 1 }).then((res) => {
        //   console.log('res => ', res);
        // });
        await imageDecoder.decode();
        await imageDecoder.completed;
        const frameCount = imageDecoder.tracks[0].frameCount;
        await imageDecoder.close()

        document.getElementById('frame').textContent = `总帧数【${frameCount}】`;
        console.log('总帧数 => ', frameCount);
      }
    </script>
  </body>
</html>

标签:const,gif,ImageDecoder,newImg,GIF,blob,file,res,动图
From: https://www.cnblogs.com/chlai/p/18129082

相关文章

  • 关于需要root权限启动图形应用记录
    关于需要root权限启动图形应用记录环境Kernel:6.8.4-arch1-1OS:ArchLinuxx86_64DE:hyprland问题来源在vmware中安装win11,想更改Edit>Preferences>Memory到"FitallvirtualmachinememoryintoreservedhostRAM"来提高访问内存效率,但必须用root运行vmware才能改变......
  • 可视化红黑树详解(gif图演示,洛谷P3369 普通平衡树)
    写在前面推荐一个很实用的工具:红黑树可视化本文参考OIwiki中的红黑树代码,读者也可以参考该篇解析(写得还是很不错的),不过OIWiki里删除后平衡维护的Case4和Case5在代码细节上稍微有些问题(把c......
  • 什么是gif? 如何把视频格式转成gif动图格式?展现动图的魅力
    一,什么是gif格式gif是一种位图图形文件格式,主要用于显示索引彩色图像。gif格式在1987年由CompuServe公司开发,它采用LZW(Lempel-Ziv-Welch)无损压缩算法,这种算法可以有效地减少图像文件在网络上传输的时间。GIF格式的特点包括支持透明背景图像,可以显示多达256种不同的颜色。G......
  • D. Birthday Gift
    原题链接题解1.异或是01变1,11变0,或是01变1,11变1,所以或的越多(即分的组越多),结果越大2.我们令x=x+1,这样小于等于x的问题就变成了小于x的问题,这里我们采用逼近答案的方法。3.对于某一位而言,如果有奇数个元素在这一位上是1,那么不管怎么分,最后的结果肯定是1,如果是偶数,那么最后的结......
  • Kruskal最小生成树【详细解释+动图图解】&【sort中的cmp函数】& 【例题:洛谷P3366 【模
    文章目录Kruskal算法简介Kruskal算法前置知识sort中的cmp函数算法思考样例详细示范与解释kruskal模版code↓例题:洛谷P3366【模板】最小生成树code↓完结撒花QWQKruskal算法简介Kr......
  • 简单好用轻量的GIF录制软件——配合全局鼠标手势实现随时随地录制
    GIF录制软件——Gif123Gif123-极简GIF录屏工具https://gif123.aardio.com/极简GIF录屏工具,可一键快速复制GIF图像并直接粘贴到其他程序。支持粘贴到本地文件、QQ、微信、Word、浏览器编辑器(支持公众号、头条编辑器)。可避免无法预览、无效图像、变静态图等常见的兼......
  • Birthday Gift
    我们将\(x++\),从而最终的答案一定是要小于\(x\)的,也就一定要有一位不同我们从高位到低位枚举最高的一位与\(x\)不同的位置\(i\)(也就是说,认为第\(i+1\)位到最高位都与\(x\)相同,但第\(i\)位不同)我们先考虑更高位置如何相同如果更高位置为\(0\),那么那一位必须只能有偶数个\(1\)(否......
  • ESP32学习,驱动LED点阵屏,显示GIF动图
    ESP32学习,驱动LED点阵屏,显示GIF动图研究了好多代码,小白也多少弄明白了,照搬呗。循环显示的GIF动图拍下来的。文章目录ESP32学习,驱动LED点阵屏,显示GIF动图前言一、pandas是什么?二、使用步骤1.主程序代码vs代码2.使用GIF工具制作动图3.使用img_to_c转换*.h文件......
  • 数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署
    简介随着数字人物概念的兴起和生成技术的不断发展,将照片中的人物与音频输入进行同步变得越来越容易。然而,目前仍存在一些问题,比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题,来自西安交通大学等机构的研究人员提出了SadTalker模型......
  • WPF中轻松操控GIF动画:WpfAnimatedGif库详解
    概述:在WPF中使用`WpfAnimatedGif`库展示GIF动画,首先确保安装了该库。通过XAML设置Image控件,指定GIF路径,然后在代码中使用库提供的方法实现动画控制。这简化了在WPF应用中处理GIF图的过程,提供了方便的接口来管理动画播放和暂停。当使用 WpfAnimatedGif 库在WPF中显示GIF图动......