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 相关文章推荐
来自qq的javascript面试题
Jul 24 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
May 29 Javascript
JavaScript插件化开发教程 (四)
Jan 27 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
vue中实现回车键登录功能
Feb 19 Javascript
Swiper实现导航栏滚动效果
Oct 16 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数据库开发知多少
2006/10/09 PHP
搜索引擎技术核心揭密
2006/10/09 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
考勤制度通知
2015/04/25 职场文书
2016年元旦致辞
2015/08/01 职场文书
施工现场安全管理制度
2015/08/05 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
go goth封装第三方认证库示例详解
2022/08/14 Golang