当前位置: 首页 > 科技观察

有趣的gif动画生成平台开发实践

时间:2023-03-21 20:38:32 科技观察

前言作者利用业余时间开发了一个gif动画生成平台。具体的开发背景,我也会在上一篇文章中教大家如何生成抖音风格的动画。图片的gif制作平台已经介绍过了。我们今天将继续实施该平台。gif动画平台的实现方式对比将完全通过前端的方式来实现,所以在接下来的内容中你会发现很多有趣的前端插件。接下来看一下要实现的主要功能点:纯前端实现图片上传和预览。基于react-beautiful-dnd,元素可以自由拖拽排序。使用javascript实现生成uuid的功能。使用file-saver实现前端下载文件。使用gif.js根据图片生成gif动画。一种控制gif动画播放速度的方法。文字还是按照作者一贯的风格。在实现功能之前,先来看看实现后的预览效果:从效果图中可以看出,我们只需要上传图片序列就可以动态生成gif动画,右键保存gif文件。我们还可以控制动画的播放速度和排列顺序,这样我们可以更灵活地配置动画。如果想亲身体验,可以使用以下方法:在线地址:http://io.nainor.com/qt。1.基本页面搭建在开始之前,我们需要梳理一下基本页面结构。作者将其分为以下结构:从上图我们可以看出分为3个区域。我们可以使用任何我们熟悉的第三方组件来实现。这里是作者使用antd开发。技术方案图如下:以上是笔者分析的大致目标,也是笔者常用的开发图。面向目标对于提高开发效率还是很有帮助的。作者建议你也可以实现更复杂的。在业务需要之前,先想好方案,再敲代码。2.实现图片上传预览功能。第一步的界面我想大家都能实现。下面我们一步步实现这个功能。我们先来实现图片上传。预览。由于我们这里不依赖服务器,完全通过前端的方式实现图片预览,所以需要用到FileReader对象。FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)内容,使用File或Blob对象指定要读取的文件或数据。File对象可以是用户在input元素上选择文件后返回的FileList对象,也可以是拖拽操作生成的DataTransfer对象,也可以是HTMLCanvasElement执行mozGetAsFile()方法后返回的结果。接下来我们看看如何使用antd的Upload组件和FileReader来实现图片预览。具体代码如下:constuploadprops=useMemo(()=>({name:'file',multiple:true,listType:"picture-card",onPreview:()=>{},showUploadList:false,beforeUpload(file,fileList){//解析并提取excel数据letreader=newFileReader();reader.onload=function(e){leturl=e.target.result;setImageList(prev[...prev,{id:uuid(6,16),url}])};reader.readAsDataURL(file);}}),[]);uploadprops是Upload组件需要的属性配置,通过代码我们可以知道我们在beforeUpload阶段截取了图片,通过readAsDataURL代码中的FileReader对象,我们把图片数据存储在一个对象中,该对象由uuid函数生成的唯一id和url组成。至于为什么会产生唯一id,笔者会在下文进行介绍。3、使用react-beautiful-dnd实现元素自由拖拽排序。学习H5-Dooring后|一个强大的开源H5编辑器,你会发现react-dnd这个模块很眼熟,因为这个开源编辑器就是用它React-dnd实现了组件拖拽和组件数据传递。笔者在社区发现了一个比较有意思的拖拽库react-beautiful-dnd,同样可以实现优雅流畅的智能拖拽效果。基本案例如下:深入研究了这个库,发现可以直接使用它来实现图片组件的拖拽排序功能,所以直接使用这个库来封装我们的图片组件。由于这个库的使用有详细的案例代码,这里就不做详细介绍了,我们只需要提一下,为了实现排序,我们需要确定每个元素的唯一标识,所以这里我想到了uuid,所以渲染图片的数组数据结构可以这样:constimgList=[{id:uuid(6,10),url:'图片的base64地址'}]为了限制图片的上传大小,我们也可以在Upload组件的beforeUpload阶段限制图片的上传大小,具体看使用情况。uuid的实现有很多种,作者这里给出一个实现://generateuuidfunctionuuid(len:number,radix:number){letchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');让uuid=[],i;radix=radix.chars长度;if(len){for(i=0;i{letrealSpeed=(20-v+1)/10;setSpeed(realSpeed)}当然你可以用更简单的方式来实现,滑块组件也提供了反向取值操作。5、根据图像序列生成gif动画根据图像序列生成gif的方法也很简单。我们批量获取图片拖拽区域的图片,组装成数组传给gif.js。直接看效果:6.使用file-saver实现前端下载文件,我们只需要将生成的gif图片传给file-saver模块,使用其提供的API即可下载文件。这个也是笔者在上一篇文章中介绍过的。这里直接上代码:import{saveAs}from'file-saver';//resultImage为gifsaveAs(resultImage,`${uuid(6,10)}.gif`);生成的gif图片对象》,可通过以下二维码关注。转载请联系趣谈前端公众号。