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 相关文章推荐
Flexigrid在IE下不显示数据的有效处理方法
Sep 04 Javascript
使用原生JS实现弹出层特效
Dec 22 Javascript
JS实现图片放大镜效果的方法
Feb 27 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
Bootstrap DateTime Picker日历控件简单应用
Mar 25 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
微信小程序获取用户信息并保存登录状态详解
May 10 Javascript
使用typescript改造koa开发框架的实现
Feb 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 join函数应用
2011/05/04 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python实现屏保计时器的示例代码
2018/08/08 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
python中类与对象之间的关系详解
2020/12/16 Python
Python创建自己的加密货币的示例
2021/03/01 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
《盘古开天地》教学反思
2014/02/28 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
单位介绍信格式
2015/01/31 职场文书
产品质量保证书范本
2015/02/27 职场文书
Django显示可视化图表的实践
2021/05/10 Python