Python實現動態圖的解析、合成與倒放
阿新 • • 發佈:2019-02-06
動態圖現在已經融入了我們的日常網路生活,大大豐富了我們的表達方式和交流趣味性。常常是一言不合就放動圖,我這裡就不舉例子了。咱們直接開始本文的內容。
用到的庫和模組
今天用看看如何用Python寫個程式,進行動態圖的解析、合成與倒放。這裡我們用到的庫有且只有PIL
。而且只用到了PIL
的兩個模組Image
和ImageSequence
。顧名思義,就是影象模組和影象序列模組。動態圖正好可以看作是影象序列。
原理
所謂動態圖的解析,就是把GIF
格式的圖片轉化為圖片流的過程,而動態圖的合成就是把圖片流重新合成GIF圖片的過程。而所謂動態圖倒放,就是把圖片流反序之後再合成GIF
了。
程式碼
原理上沒啥難以理解的,我們還是直接看程式碼。
from PIL import Image, ImageSequence
# 讀取GIF
im = 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:])
加上註釋之後的程式碼完全沒啥可說的有木有?
其實還還是有些地方可說的,比如圖片為啥儲存為PNG
格式的,JPG
行不行?比如第六行與第19行末尾的程式碼是否重複,第19行末尾能不能用iter
代替?
這些問題知道的就算了,不知道的希望能夠自己跑一跑程式碼,查一查資料,補充下這方面的小知識。
效果
倒放
圖片流
公眾號CVPy,分享OpenCV和Python的實戰內容。。歡迎關注。