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 相关文章推荐
JS JavaScript获取Url参数,src属性参数
Mar 09 Javascript
jquery 新浪网易的评论块制作
Jul 01 Javascript
基于jQuery架构javascript基础体系
Jan 01 Javascript
javascript 45种缓动效果 非常酷
Jun 28 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
jQuery实现标题有打字效果的焦点图代码
Nov 16 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
Angular2库初探
Mar 01 Javascript
VUE 3D轮播图封装实现方法
Jul 03 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
详解vue 组件的实现原理
Nov 12 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性能优化的介绍
2013/06/20 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python数据分析库pandas基本操作方法
2018/04/08 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
python机器学习之神经网络实现
2018/10/13 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
最新大学职业规划书范文
2013/12/30 职场文书
大四本科生的自我评价
2013/12/30 职场文书
初中音乐教学反思
2014/01/12 职场文书
个人求职信范文分享
2014/01/31 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
大学生操行评语大全
2014/12/31 职场文书
信仰纪录片观后感
2015/06/08 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python