之前在Q群里里面看到群机器人有个生成撅人表情包的功能,如下图所示,当时就在想能不能自己用JS也实现个,但感觉自己这方面一片空白,一直就没弄,直到有次电脑打开了这个表情gif
,发现一共就三帧动画,好像也不是很复杂的样子,于是乎就又有动力了。
记得在张鑫旭大佬博客看到过生成gif图的文章,搜了下是gif.js
库,然后就是引用库,加上ai一顿乱套代码,屎山代码把功能实现了,就是用canvas
画三个画布,然后gif.js
合并canvas
变成gif
图。
因为canvas
我不熟练,代码ai加上自己理解乱弄的很乱,后来想到html2canvas
库,我就自己用html布局,然后用html2canvas
把html
布局变成canvas
,最后再用gif.js
合并。步骤多了但用html
布局舒服多了,代码清晰自己也能看懂了。
问题
gif.js
生成的透明背景图,会导致黑色部分也变透明,实际上他处理过程是把透明背景当成黑色,然后再统一把黑色变透明,导致的这个问题,可以用transparent
设置个颜色,然后把它替换成透明而不是把黑色替换成透明,然后html2canvas
也可以设置背景色,之前是设置成透明,现在就设置成和transparent
参数一个颜色就行了,这个颜色最好不容易和图片本身冲突,避免倍替换成透明。
本以为这样就非常ok了,然后发现使用绿色,洋红等颜色后,生成的透明背景gif
图中间不透明区域的边框有1px
的带颜色的描边,经过一番研究觉得可能是透明png
素材的边界处有半透明色导致和设置颜色混合的问题,进而导致这1px
的颜色既不是设定的颜色,也不是半透明,然后自己对图片格式,色彩位数也不是很了解,不知道怎么改变好素材,我就把替换色换成了灰色解决,所以最终成品会干掉某个色值的灰色。
还有个问题,就是有时候生成的gif
的第一帧背景不会被替换,出现的概率不是很大,可能也和图片有关系,某些图就100%触发,换了个transparent
值又好了,但是我觉得和transparent
关系又不大,挺迷惑的。
成果
做完一个后成就感拉满,然后又做了两个别的,这两个素材中的手就是我的左右手哈哈哈!
泽泽撅我:https://91ntr.cn/tool/jue.php
泽泽 RUA 我 (泽泽左手):https://91ntr.cn/tool/rua.php
泽泽捏我 (泽泽右手):https://91ntr.cn/tool/nie.php
关于效果预览
gif
的本质就是多张图片以一定时间切换,这样看起来就是动起来了,而我这里的布局是用html
写的,也就是说我只要让多个div
切换显示就可以实现实时预览了,利用定时器设置好时间间隔,不断的切换div显示与隐藏,模拟出来了gif
的感觉了,非常完美😄
改一下,我撅泽泽
孩儿怕