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 Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
循环 vs 递归浅谈
Feb 28 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
JS定义网页表单提交(submit)的方法
Mar 20 Javascript
js实现简单锁屏功能实例
May 27 Javascript
jQuery实现固定在网页顶部的菜单效果代码
Sep 02 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
微信小程序自定义组件
Aug 16 Javascript
浅谈react 同构之样式直出
Nov 07 Javascript
JavaScript callback回调函数用法实例分析
May 08 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 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
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
一个精品风格的世界:Atterley
2019/05/01 全球购物
上课打牌的检讨书
2014/02/15 职场文书
个人投资计划书
2014/05/01 职场文书
电钳工人个人求职信
2014/05/10 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
争先创优演讲稿
2014/09/15 职场文书
解除劳动合同协议书
2014/09/17 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
论语读书笔记
2015/06/26 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
JS函数式编程实现XDM一
2022/06/16 Javascript