Python實現動態圖的解析、合成與倒放
動態圖現在已經融入了我們的日常網路生活,大大豐富了我們的表達方式和交流趣味性。常常是一言不合就扔動圖,我這裡就不舉例子了,例子太多,平時大家也都接觸過。咱們直接開始本文的內容。
用到的庫和模塊
今天用看看如何用Python寫個程序,進行動態圖的解析、合成與倒放。這裡我們用到的庫有且只有PIL
。而且只用到了PIL
的兩個模塊Image
和ImageSequence
。顧名思義,就是圖像模塊和圖像序列模塊。動態圖正好可以看作是圖像序列。
簡單的原理和代碼
所謂動態圖的解析,就是把GIF
格式的圖片轉化為圖片流的過程,而動態圖的合成就是把圖片流重新合成GIF圖片的過程。而所謂動態圖倒放,就是把圖片流反序之後再合成GIF
了。
原理上沒啥難以理解的,我們還是直接看代碼。
from PIL import Image, ImageSequence # 讀取GIFim = Image.open("5.gif")# GIF圖片流的迭代器iter = ImageSequence.Iterator(im)index = 1# 遍歷圖片流的每一幀for frame in iter: print("image %d: mode %s, size %s" % (index, frame.mode, frame.size)) frame.save("./imgs/frame%d.png" % index) index += 1# frame0 = frames[0]# frame0.show()# 把GIF拆分為圖片流imgs = [frame.copy() for frame in ImageSequence.Iterator(im)]# 把圖片流重新成成GIF動圖imgs[0].save("out.gif", save_all=True, append_images=imgs[1:])# 圖片流反序imgs.reverse() # 將反序後的所有幀圖像保存下來imgs[0].save("./reverse_out.gif", save_all=True, append_images=imgs[1:])
效果
以下是動圖原圖、效果圖。
倒放的動態圖(由於公眾號圖片不能大於2M,圖片流被我抽去了幾張。。。)
動態圖解析得到的圖片流:
補充說明
加上注釋之後的代碼完全沒啥可說的有木有?
其實還還是有些地方可說的,比如圖片為啥保存為PNG
格式的,JPG
行不行?比如第六行與第19行末尾的代碼是否重複,第19行末尾能不能用iter
代替?
這些問題知道的就算了,不知道的希望能夠自己跑一跑代碼,查一查資料,補充下這方面的小知識。
推薦閱讀:
※此庫在手,好片無憂!Python爬片,小手不抖
※Python3 CookBook | 日期和時間
※Python非同步io的Web框架-Sanic源碼分析(核心篇)
※左手用R右手Python系列之——表格數據抓取之道