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

教你制作一个可以生成抖音风格动画的gif制作平台

时间:2023-03-17 21:05:54 科技观察

前言又是每周总结了。笔者在之前的开源项目blink的基础上,开发了一个可以在线配置的glitchart,一键生成gif动画的平台,这里暂命名为QT。接下来笔者就来回顾一下可视化平台的实现步骤和功能点,方便大家制作自己的Gif动画生成平台。在线访问地址:趣图——一个轻量级的抖音风格动画文字在线生成工具开始写之前,先来看一下效果图:首先我们来拆解一下功能:图文编辑区——用来编辑动画styles,asktext等预览区-用于实时预览用户配置的动画效果结果显示区-用于存放生成的gif效果gif文件自动下载这里简单介绍一下背景:之后笔者打开了生成自定义毛刺美术的组件库Blink,发现如果要将毛刺动画放到第三方平台上,必须要使用第三方录屏软件,先录制动图,然后保存gif,然后传输到第三方平台。操作链接如下:作者受不了这么多步骤。一般在笔者的认知中,实现一个简单的东西通常需要3个以上。这一步是笔者无法接受的,尤其是录屏这种耗时的工作。于是三思而后行,决定自己开发一个平台,将步骤压缩为2步:OK,下面开始我们的技术探索。1.1开发图形编辑图形编辑区主要用于表格编辑。这里我使用antd来快速搭建一个简单的表单。唯一值得注意的是颜色成分。这里我用的是react-color,因为vue3.0对jsx的支持越来越好,所以实现原理和react很像,这里直接用react来举例。代码如下:placeholder="请输入文字内容"onChange={(e)=>onChange('text',e)}/>

大小:onChange('fontSize',e)}/>
文本颜色:onChange('textColor',e,1)}/>onChange('textColor',e,2)}/>
背景颜色:onChange('themeColor',e)}/>
导出Gif{/*重置*/>代码细节不需要太在意,可以使用任何熟悉的方式开发,表单编辑器主要是实现与预览区,在react中我们使用hooks组件UseState与Blink组件通信。对于vue,可以直接使用data或者vuex解决问题。具体实现如下:只要能实现这个过程即可。QT工程中的效果如下:1.2实现预览区预览区实现很简单,通过Blink暴露的属性动态传递即可,这里我们需要了解一下Blink的内部实现,先去github地址:基于react的css故障艺术库,我们直接看组件的实现:importReact,{useRef,useEffect}from'react'import'./index.less'exportdefaultfunctionBlink(props){const{text='有趣的前端',fontSize='48px',themeColor='#000',textColor=['#74fcfd','#ea3448'],onRef}=propsconstref=useRef(null)useEffect(()=>{onRef&&onRef(ref)},[])return({text}{text})}关于样式问题,作者是我知乎里面有详细的介绍,这里就不赘述了。所以我们在项目中实现预览很简单,直接导入组件即可:{blinkRef.current=ref.current}}/>value为表单表单的配置产品。1.3实现gif动画的预览实现gif动画的预览是本文的重点。我们要考虑怎么把dom转成图片,再把图片转成gif。笔者想了想,想出了一个解决办法。思路如下:首先利用canvas库定时抓取预览区的动画效果,生成n张关键帧图片,然后利用canvas将多个关键帧拼装成gif动画笔者的思路主要是通过key的实现flash软件的帧动画,具体流程如下:图中我们涉及到了几个比较有意思的插件,笔者在H5-Dooring项目中也用到了,分别是:dom-to-image——旋转门dom转图片的库gif.js——将多张图片转成gif动画在实现过程中,由于dom-to-image生成图片的过程是异步的,但是我们需要生成所有的图片,然后可以传给gif.js,这里作者使用了promise.all;实现(注意,测试点)。我们先将第一步封装成一个新的promise对象两次,代码如下:toPng(node).then(函数(dataUrl){letimg=newImage();img.src=dataUrl;img.id=imgId;img.className='imgPiece';document.getElementById('imgBox').appendChild(img);resolve(document.getElementById(imgId));}).catch(function(error){reject(error);});},time)})}其次,我们使用promise.all统一采集图片传递给gif.js对象:constgenerateGif=()=>{document.getElementById('imgBox').innerHTML='';letblink=blinkRef.current;letpromiseArr=[];for(leti=0,len=24;i{if(res){letw=res[0].width;leth=res[0].height;//res都是img集合,可以直接传给gif.js...});}})}关于gif的使用。js的方法在官网也有详细的介绍。这里我就不一一举例了。有兴趣的朋友可以研究一下。1.4一键下载gif动画实现下面我们使用file-saver模块来实现gif文件,实现思路也很简单,如下:saveAs(image,`${uuid(6,10)}.gif`);image是gif.js或者其他动画插件生成的gif图片,uuid主要用来给图片命名。我们可以看到几个下载的gif的例子:最后在H5编辑器H5-Dooring中,后期会实现类似的功能。有兴趣的可以查看github:H5编辑器H5-Dooringgithub:Blink本文转载自微信公众号《讲前端的趣事》,可以通过以下二维码关注。转载本文请联系前端?。