【实用技巧】教你如何用PIL给gif文件降帧
2020-12-28 20:50
1566 查看
“最近在做公众号的时候,想添加一些gif动图,好让内容看起来更生动一些,但却遇到了这样的问题。
图片
“没错,微信公众号规定了上传的gif最高帧数不能超过300。
考虑到我后面内容中会用到不少gif图片,并且很多帧数超过300帧;
肯定不可能一张一张地找出来设置帧数。
于是就想着能不能通过Python,实现一键压缩gif帧数的办法。
网上找了很多资料,没有令自己满意的,所以在这里着手写一个开发贴,
分享给那些需要对gif自动化降帧的朋友。
1. 准备第三方库
“我们会用到Python最常用, 功能强大的PIL库来对图片进行处理; 同时,我们会用到一个叫做imageio的第三方库,来对gif进行压缩。
import os import imageio from PIL import Image, ImageSequence
2. 打开gif图片并逐帧进行保存
“这里会用到PIL里一个叫做ImageSequence的模块,主要用来逐帧展开gif,并返回成迭代器;
im = Image.open(source_file) index = 1 for frame in ImageSequence.all_frames(im): frame = frame.convert('RGB') frame.save(f"gif{index}.jpg", quality=100) index = index + 1
3. 执行降帧并存储为gif
“由于要降帧,所以会跳过一些帧幅,变量n是用来计算跳帧频率的。 这里使用imageio这个库,对图片序列进行保存和压缩。
n = int(index / frame_limit) + 1 images = [] for i in range(1, index): if i % n == 0: images.append(imageio.imread(f'gif{i}.jpg')) imageio.mimsave(target_file, images, duration=0.1)
4. 将过程文件删除
“在读取帧幅的时候,会将帧幅保存在本地的临时文件; 完成降帧后,这些临时的帧幅图片会通过下述代码批量删除。
for i in range(1, index): f = 'gif' + str(i) + '.jpg' if os.path.exists(f): os.remove(f)
“好了,我通过以上的代码对下图进行了降帧:
降帧前
降帧前
降帧后
降帧后
“可以看到降帧后图片中的光标闪烁频率明显高于降帧前,实际帧数也从260多帧降到了100多帧。
降帧成功!
有需要的小伙伴,可以在老K玩代码公众号回复"降帧",获取源文件
“
- 感谢您一路读到了最后,部分内容整理自网络,侵删
- 如果这篇文章对您有帮助,请记得分享或在看这篇文章。
- 如果对文中的内容有疑问、错误或有意见想告诉我,欢迎留言。
欢迎关注《老K玩代码》公众号,获得更多实战案例和行业资讯。
相关文章推荐
- 数据可视化有什么好的Python项目?
- 【干货】15个帮您编程入门的高质量免费在线课资源
- 【热荐】必须推荐的7个Python深度学习项目
- 【热荐】必须推荐的10个JavaScript基础开发项目
- Spring--->FactoryBean创建复杂对象
- Spring--->aop面向切面编程
- 设计模式--->动态代理模式
- Vue2+Koa2+Typescript前后端框架教程--04班级管理示例(路由调用控制器)
- IDEA修改maven的默认配置
- 【热荐】github上值得学习的7个人工智能项目.md
- 为什么计算机语言中的下标都是从0开始的?
- Selenium Select下拉框
- 【Azure Redis Cache】对StackExchange.Redis IOCP错误消息的解读
- PHP中PDO关闭连接的问题
- Android逆向快速定位
- R语言用ARIMA模型预测巧克力的兴趣趋势时间序列
- JDK8-日期时间新方式
- 子网划分多图解析
- three.js 15b0 WebGLRenderTarget
- CentOS6停止维护后yum源更换