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

在项目中遇到需要支持上传gif图片,并把其分解的帧图片一次展示给用户。话不多说直接上代码

分解gif图片需要使用https://github.com/buzzfeed/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)})
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值