js实现GIF动图分解成多帧图片上传
在项目中遇到需要支持上传gif图片,并把其分解的帧图片一次展示给用户。话不多说直接上代码
分解gif图片需要使用libgif-js这个库!
1.引入Git库
importSuperGiffrom'./libgif.js'
2.分解Gif为png图片
constGifDecomposer={
structureGifObject(gifFiles,cb){//gifFiles获取的文件对象e.target.files[0]
constgifImg=document.createElement('img');
gifImg.setAttribute('rel:animated_src',URL.createObjectURL(gifFiles));
gifImg.setAttribute('rel:auto_play','0');
//Modifiedpicturesmustbeaddedtothebody
document.body.appendChild(gifImg);
//Constructionexample
varrub=newSuperGif({gif:gifImg});
rub.load(()=>{
varimg_list=[];
for(leti=1;i<=rub.get_length();i++){
//TraversingthrougheachframeofaGIFinstance
rub.move_to(i);
//Convertingeachframeofcanvasintoafileobject
letcur_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){
constarr=dataurl.split(',');
constmime=arr[0].match(/:(.*?);/)[1];
constbstr=atob(arr[1]);
varn=bstr.length;
constu8arr=newUint8Array(n);
while(n--){
u8arr[n]=bstr.charCodeAt(n);
}
returnnewFile([u8arr],filename,{type:mime});
},
convertCanvasToImage(canvas,filename){
returnthis.dataURLtoFile(canvas.toDataURL('image/png'),filename);
}
}
3.上传每一张图片
/**
*costumeuploadGIFdecomposer
*/
constfilesImg=function(list,storage,costumeFormat,assetType,handleCostume){
letproDataList=list.map((item,index)=>{
returnnewPromise(function(resolve,reject){
letreader=newFileReader();
reader.readAsArrayBuffer(item.file);
reader.onload=()=>{
letdata={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)})
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。