【實用技巧】教你如何用PIL給gif文件降幀

「最近在作公衆號的時候,想添加一些gif動圖,好讓內容看起來更生動一些,但卻遇到了這樣的問題。

【實用技巧】教你如何用PIL給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)
「好了,我經過以上的代碼對下圖進行了降幀:

【實用技巧】教你如何用PIL給gif文件降幀
降幀前
降幀前
【實用技巧】教你如何用PIL給gif文件降幀
降幀後
降幀後app

「能夠看到降幀後圖片中的光標閃爍頻率明顯高於降幀前,實際幀數也從260多幀降到了100多幀。

降幀成功!
有須要的小夥伴,能夠在老K玩代碼公衆號回覆"降幀",獲取源文件ide

code

  • 感謝您一路讀到了最後,部份內容整理自網絡,侵刪
  • 若是這篇文章對您有幫助,請記得分享或在看這篇文章。
  • 若是對文中的內容有疑問、錯誤或有意見想告訴我,歡迎留言。
    【實用技巧】教你如何用PIL給gif文件降幀歡迎關注《老K玩代碼》公衆號,得到更多實戰案例和行業資訊。
相關文章
相關標籤/搜索