「最近在作公衆號的時候,想添加一些gif動圖,好讓內容看起來更生動一些,但卻遇到了這樣的問題。
圖片
「沒錯,微信公衆號規定了上傳的gif最高幀數不能超過300。
考慮到我後面內容中會用到很多gif圖片,而且不少幀數超過300幀;
確定不可能一張一張地找出來設置幀數。
因而就想着能不能經過Python,實現一鍵壓縮gif幀數的辦法。
網上找了不少資料,沒有令本身滿意的,因此在這裏着手寫一個開發貼,
分享給那些須要對gif自動化降幀的朋友。微信
「咱們會用到Python最經常使用, 功能強大的PIL庫來對圖片進行處理; 同時,咱們會用到一個叫作imageio的第三方庫,來對gif進行壓縮。
import os import imageio from PIL import Image, ImageSequence
「這裏會用到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
「因爲要降幀,因此會跳過一些幀幅,變量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)
「在讀取幀幅的時候,會將幀幅保存在本地的臨時文件; 完成降幀後,這些臨時的幀幅圖片會經過下述代碼批量刪除。
for i in range(1, index): f = 'gif' + str(i) + '.jpg' if os.path.exists(f): os.remove(f)
「好了,我經過以上的代碼對下圖進行了降幀:
降幀前
降幀前
降幀後
降幀後app
「能夠看到降幀後圖片中的光標閃爍頻率明顯高於降幀前,實際幀數也從260多幀降到了100多幀。
降幀成功!
有須要的小夥伴,能夠在老K玩代碼公衆號回覆"降幀",獲取源文件ide
「code