關注老K玩代碼公眾號,回復"Python"獲取更多學習資源;
加kevinchaos微信,驗證"玩代碼", 直接和作者對話;
最近在做公眾號的時候,想添加一些gif動圖,好讓內容看起來更生動一些,但卻遇到了這樣的問題。
圖片「沒錯,微信公眾號規定了上傳的gif最高幀數不能超過300。
考慮到我後面內容中會用到不少gif圖片,並且很多幀數超過300幀;
肯定不可能一張一張地找出來設置幀數。
於是就想著能不能通過Python,實現一鍵壓縮gif幀數的辦法。
網上找了很多資料,沒有令自己滿意的,所以在這裡著手寫一個開發貼,
分享給那些需要對gif自動化降幀的朋友。
我們會用到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玩代碼》公眾號,獲得更多實戰案例和行業資訊。
不用讚賞,文末點個「在看」就好