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 相关文章推荐
javascript IE中的DOM ready应用技巧
Jul 23 Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
简介JavaScript中的unshift()方法的使用
Jun 09 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
js实现音乐播放控制条
Sep 09 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
Jun 24 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
封装微信小程序http拦截器过程解析
Aug 13 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
jquery插件之easing 动态菜单
2010/08/21 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
js实现随机抽奖
2020/03/19 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
超市国庆节促销方案
2014/02/20 职场文书
法人代表任命书范本
2014/06/05 职场文书
大学计划书范文800字
2014/08/14 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
见习报告的格式
2014/10/31 职场文书
职代会闭幕词
2015/01/28 职场文书
员工表扬信怎么写
2015/05/05 职场文书
小学运动会前导词
2015/07/20 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
python元组打包和解包过程详解
2021/08/02 Python