js实现GIF动图分解成多帧图片上传

 更新时间:2019年10月24日 11:03:45   作者:leez1212  
这篇文章主要为大家详细介绍了js实现GIF动图分解成多帧图片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在项目中遇到需要支持上传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)})
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Bootstrap基本插件学习笔记之按钮(21)

    Bootstrap基本插件学习笔记之按钮(21)

    这篇文章主要为大家详细介绍了Bootstrap基本插件学习笔记之按钮的相关资料,实现按钮状态控制等形式的交互,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • js实现仿阿里巴巴城市选择框效果实例

    js实现仿阿里巴巴城市选择框效果实例

    这篇文章主要介绍了js实现仿阿里巴巴城市选择框效果,实例分析了javascript结合css与数组实现城市选择框的方法,需要的朋友可以参考下
    2015-06-06
  • setTimeout()递归调用不加引号出错的解决方法

    setTimeout()递归调用不加引号出错的解决方法

    用了setTimeout()想实现递归调用,如果第一个参数不加引号的话,就会出错,下面与大家分享下该如何解决
    2014-09-09
  • 理解javascript中的回调函数(callback)

    理解javascript中的回调函数(callback)

    这篇文章主要介绍了理解javascript中的回调函数(callback),本文着重于对回调函数概念的理解,需要的朋友可以参考下
    2014-09-09
  • JavaScript仿小米轮播图效果

    JavaScript仿小米轮播图效果

    这篇文章主要为大家详细介绍了JavaScript仿小米轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • JavaScript数组复制详解

    JavaScript数组复制详解

    对于javascript来说,数组是一种引用类型,如果只是一维数组的话,复制还较为容易,如果是多维数组呢?如何实现多维数组的深度复制?
    2017-02-02
  • 基于JavaScript实现熔岩灯效果导航菜单

    基于JavaScript实现熔岩灯效果导航菜单

    这篇文章主要介绍了基于JavaScript实现熔岩灯效果导航菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 无废话JavaScript教程(全集)

    无废话JavaScript教程(全集)

    许多读者认为我那本《JavaScript语言精髓与编程实践》读来辛苦,所以我一直想写个简单的读本。索性,这次就写个最简单的吧。
    2008-10-10
  • 小程序实现图片预览裁剪插件

    小程序实现图片预览裁剪插件

    这篇文章主要为大家详细介绍了小程序实现图片预览裁剪插件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • javascript中使用new与不使用实例化对象的区别

    javascript中使用new与不使用实例化对象的区别

    这篇文章主要介绍了javascript中使用new与不使用实例化对象的区别的相关资料,需要的朋友可以参考下
    2015-06-06

最新评论