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函数
Nov 20 Javascript
JS清空多文本框、文本域示例代码
Feb 24 Javascript
javascript(js)的小数点乘法除法问题详解
Mar 07 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
详解js的事件处理函数和动态创建html标记方法
Dec 16 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
Aug 29 jQuery
javaScript强制保留两位小数的输入数校验和小数保留问题
May 09 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
原生javascript单例模式的应用实例分析
Feb 23 Javascript
javascript实现前端成语点击验证
Jun 24 Javascript
Vue实现动态查询规则生成组件
May 27 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
php 进度条实现代码
2009/03/10 PHP
php 操作符与控制结构
2012/03/07 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python中JWT用户认证的实现
2020/05/18 Python
Python requests接口测试实现代码
2020/09/08 Python
制衣厂各岗位职责
2013/12/02 职场文书
幼儿园秋游感想
2014/03/12 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
玄武湖导游词
2015/02/05 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
python通配符之glob模块的使用详解
2021/04/24 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle