码迷,mamicode.com
首页 > 其他好文 > 详细

【实用技巧】教你如何用PIL给gif文件降帧

时间:2021-01-02 10:30:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:添加   资料   文件   file   pytho   ==   python   com   convert   

“最近在做公众号的时候,想添加一些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玩代码》公众号,获得更多实战案例和行业资讯。

【实用技巧】教你如何用PIL给gif文件降帧

标签:添加   资料   文件   file   pytho   ==   python   com   convert   

原文地址:https://blog.51cto.com/15069443/2576250

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!