知行编程网知行编程网  2022-07-08 05:00 知行编程网 隐藏边栏 |   抢沙发  5 
文章评分 0 次,平均分 0.0

前言

本文有很多超实用的小知识点,你看完这篇文章,不仅仅收获一项技能,你收获的还有很多不同的知识。
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?
斗图一直是群里面的朋友最喜欢的活动,也确实很有意思,但是那都是别人做的。如果我自己想制作一个动态图,怎么办呢?比如说,将自己的男(女)朋友的照片,也做成一个gif动态图,再附带上一些文字,是不是超有趣!
制作之前的原始图片如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?
制作以后的gif动态图如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?
可以看到上述gif图,切换的速度很快,我们也可以适当的放慢这个速度,是不是很有意思。
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?
事实上,我们也可以给图片添加文字,那样这个gif图循环播放的时候,就会有不同的字。出于文章篇幅的原因,给图片添加文字,就留着大家下去思考。
赶紧去微信使用自己制作的gif图吧!

gif图制作流程

那么这样一个gif动态图,是怎么制作的呢?现在我就带着大家一步步剖析。我目前使用的jupyter notebook为大家讲解,所以我会尽量将每个知识点,讲述的很细化。

1)获取当前的工作路径

<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;">path = os.getcwd()<br  />print(path)</span></section>
结果如下:

20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

2)获取当前工作路径下的文件列表

<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;">file_list = os.listdir(path)<br  />print(file_list)</span></section>
结果如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

3)复制一个列表

这里主要介绍的是列表的copy()方法,大家可以自行下去对比学习它与deepcopy()方法的区别。
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;">png_list = file_list.copy()<br  />print(png_list)</span></section>
结果如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

4)移除结尾不是png的文件,只保留结尾都是png的文件

如果你的图片都是jpg结尾的,这里都换成jpg,因为我的图片都是png结尾的。同时这里介绍了列表的remove()方法,具体细节大家还是自行下去百度。
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;"><span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">for</span> file <span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">in</span> file_list:<br  />    <span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">if</span> file[<span style="font-size: 13px;color: rgb(184, 215, 163);line-height: 26px;">-3</span>:]!= <span style="font-size: 13px;color: rgb(214, 157, 133);line-height: 26px;">"png"</span>:<br  />        png_list.remove(file)<br  />print(png_list)</span></section>
结果如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

5)将图片文件中的数字,升序排列

可以看到,我这里图片文件的数字都是1-7排列好的,升序排列后,数字较小的图片,位于gif动态图的最前面。
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;">png_list.sort(key=<span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">lambda</span> x: float(x[:<span style="font-size: 13px;color: rgb(184, 215, 163);line-height: 26px;">-4</span>]))<br  />png_list</span></section>
结果如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

6)拼接得到每张图片的绝对路径

<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;"><span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">for</span> png <span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">in</span> png_list:<br  />    image_path = os.path.join(path, png)<br  />    print(image_path)</span></section>
结果如下:
20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

7)获取每张照片的RGB通道值,将7张照片的RGB通道值,保存在列表中

<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;"><span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">for</span> png <span style="font-size: 13px;color: rgb(86, 156, 214);line-height: 26px;">in</span> png_list:<br  />    image_path = os.path.join(path, png)<br  />    frames.append(imageio.imread(image_path))<br  />print(len(frames))</span></section>
结果如下:

8)将图片保存为gif图,设置了切换时间

关于imageio库的相关用法,大家需要自行下去学习。我这里只能是抛砖引玉,授人以鱼不如授人以渔。
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(220, 220, 220);display: -webkit-box;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;font-size: 12px;background: rgb(30, 30, 30);border-radius: 5px;margin-left: 0px;margin-right: 0px;"><span style="font-size: 13px;">gif_path = os.path.join(path, <span style="font-size: 13px;color: rgb(214, 157, 133);line-height: 26px;">"my_gif.gif"</span>)<br  />imageio.mimsave(gif_path, frames, <span style="font-size: 13px;color: rgb(214, 157, 133);line-height: 26px;">'GIF'</span>, duration=DURATION)</span></section>

如何获取源码:
本文完整代码,已经封装成函数,在下面的「程序员GitHub」后台输入:gif 即可

本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享