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 相关文章推荐
FireFox JavaScript全局Event对象
Jun 14 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
jQuery提交表单ajax查询实例代码
Oct 07 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
JS中正则表达式全局匹配模式 /g用法详解
Apr 01 Javascript
ES6新增数据结构WeakSet的用法详解
Aug 07 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
JS对日期操作封装代码实例
Nov 08 Javascript
JavaScript中ES6规范中let和const的用法和区别
Aug 06 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 Undefined index报错的修复方法
2011/07/17 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
Python中生成Epoch的方法
2017/04/26 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
windows下python安装pip方法详解
2020/02/10 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
在校生党员自我评价
2013/09/25 职场文书
毕业生找工作推荐信
2013/11/21 职场文书
观后感格式
2015/06/19 职场文书
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
Python中re模块的元字符使用小结
2022/04/07 Python