js实现GIF动图分解成多帧图片上传


Posted in Javascript onOctober 24, 2019

在项目中遇到需要支持上传gif图片,并把其分解的帧图片一次展示给用户。话不多说直接上代码

分解gif图片需要使用libgif-js这个库!

1. 引入Git库

import SuperGif from './libgif.js'

2. 分解Gif为png图片

const GifDecomposer = {
  structureGifObject (gifFiles, cb) { // gifFiles 获取的文件对象 e.target.files[0]
    const gifImg = document.createElement('img');
    gifImg.setAttribute('rel:animated_src', URL.createObjectURL(gifFiles));
    gifImg.setAttribute('rel:auto_play', '0');
    // Modified pictures must be added to the body
    document.body.appendChild(gifImg);
    // Construction example
    var rub = new SuperGif({ gif: gifImg });
    rub.load(() => {
      var img_list = [];
      for (let i=1; i <= rub.get_length(); i++) {
        // Traversing through each frame of a GIF instance
        rub.move_to(i);
        // Converting each frame of canvas into a file object
        let cur_file = this.convertCanvasToImage(rub.get_canvas(), gifFiles.name.replace('.gif', '') + `-${i}`)
        img_list.push({
          file_name: cur_file.name,
          url: URL.createObjectURL(cur_file),
          file: cur_file,
        })
      }
      cb(img_list)
    });
  },
  dataURLtoFile (dataurl, filename) {
    const arr = dataurl.split(',');
    const mime = arr[0].match(/:(.*?);/)[1];
    const bstr = atob(arr[1]);
    var n = bstr.length;
    const u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {type:mime});
  },
  convertCanvasToImage (canvas, filename) {
    return this.dataURLtoFile(canvas.toDataURL('image/png'), filename);
  }
}

3. 上传每一张图片

/**
 * costume upload GIF decomposer
 */
 const filesImg = function (list, storage, costumeFormat, assetType, handleCostume) {
  let proDataList = list.map((item, index) => {
      return new Promise(function(resolve, reject) {
        let reader = new FileReader();
        reader.readAsArrayBuffer(item.file);
        reader.onload = () => {
          let data = {result: reader.result, type: item.file.type, name: item.file.name}
          resolve(data);
        };
        reader.onerror = (error) => {reject(error)};
      })
    })
  Promise.all(proDataList).then(res => {
    res.forEach(item => {
    // 上传
    })
  }).catch(data => {console.log(data)})
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javscript对象原型的一些看法
Sep 19 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
Jul 10 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
jQuery实现类似淘宝购物车全选状态示例
Jun 26 Javascript
详解jQuery中的事件
Dec 14 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
使用JavaScript实现alert的实例代码
Jul 06 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
js实现简单掷骰子效果
Oct 24 #Javascript
使用jQuery实现掷骰子游戏
Oct 24 #jQuery
jquery实现掷骰子小游戏
Oct 24 #jQuery
JS控制GIF图片的停止与显示
Oct 24 #Javascript
js计时事件实现圆形时钟
Mar 25 #Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
Oct 24 #Javascript
vue项目使用.env文件配置全局环境变量的方法
Oct 24 #Javascript
You might like
PHP define函数的使用说明
2008/08/27 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
wxPython的安装与使用教程
2018/08/31 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
护士岗前培训自我评鉴
2014/02/28 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
寒假安全保证书
2015/02/28 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
小学班长竞选稿
2015/11/20 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python