您的位置:首页 > 其它

【实用技巧】教你如何用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玩代码》公众号,获得更多实战案例和行业资讯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: