#! /usr/local/bin/python3
# -*- coding: utf-8 -*-
from PIL import Image
import os
import imageio
def SplitGif(gifPath):
# 获取png存储的文件夹的地址
pngDir = gifPath[:-4]
# 要存储的文件夹下清理干净,避免影响当前操作
rmPngDir(pngDir)
# 创建存储的文件夹
os.mkdir(pngDir)
# 把指定gif拆分后存储到指定文件夹
savePngToDir(gifPath, pngDir)
def rmPngDir(pngDir):
if os.path.exists(pngDir):
files = os.listdir(pngDir)
# 如果不一个一个的移除文件夹下的文件的话,无法移除文件夹
for file in files:
file = pngDir + "/" + file
os.remove(file)
os.rmdir(pngDir)
def savePngToDir(gifPath, pngDir):
# 通过路径传教image对象
image = Image.open(gifPath)
try:
# 循环,通过异常方案退出循环
while True:
# 获取当前的索引的位置
current = image.tell()
# 创建文件路径
pngPath = pngDir + '/' + str(current) + '.png'
image.save(pngPath, quality=100)
# 索引后移,越界后异常,退出当前循环
image.seek(current + 1)
except EOFError as e:
print(e)
pass
def Combine2Gif(folderPath, gifFilePath):
GenerateGif(0.1, gifFilePath, getPngArray(folderPath))
# 获取文件的数组
def getPngArray(folderPath):
files = os.listdir(folderPath)
pngFiles = []
# 通过设置step,将文件的大小修改为原来的体积的1/step
for i in range(0, len(files), 5):
pngFiles.append(folderPath + "/" + ('%d.png' % i))
return pngFiles
def GenerateGif(step, gifPath, filterPngs):
images = []
for filePath in filterPngs:
images.append(imageio.imread(filePath))
# 生成gif,duration 是播放两个图片之间的间隔时间
imageio.mimsave(gifPath, images, duration=step)
if __name__ == "__main__":
# 设置源gif的地址
sourceGifPath = "/Users/user/test/f79a3e2c2e864863a6b1a66791cb0950_tplv-k3u1fbpfcp-watermark.gif"
# 将gif拆分成多个图片,并保存在本地
SplitGif(sourceGifPath)
# 将指定位置的文件下的图片按照文件名索引排序,做成gif
Combine2Gif(sourceGifPath[:-4], sourceGifPath[:-4] + "_result.gif")
print("== finished ==")