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 相关文章推荐
基于jquery的3d效果实现代码
Mar 23 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
jQuery操作Select的Option上下移动及移除添加等等
Nov 18 Javascript
JS使用getComputedStyle()方法获取CSS属性值
Apr 23 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
javascript实现dom元素可拖动
Mar 21 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
Jun 19 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
vue如何搭建多页面多系统应用
Jun 17 Javascript
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
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
PHP4实际应用经验篇(7)
2006/10/09 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
PHP文件与目录操作示例
2016/12/24 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
python选择排序算法实例总结
2015/07/01 Python
利用python批量检查网站的可用性
2016/09/09 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
python文件操作的简单方法总结
2019/11/07 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
python 函数中的参数类型
2020/02/11 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
党风廉正建设责任书
2015/01/29 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
高中体育课教学反思
2016/02/16 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
吃通javascript正则表达式
2021/04/21 Javascript