最近比较堕落,没找到新鲜素材。索性再写一篇Python处理日常任务的文章。
做自媒体的朋友为了让自己的文章内容生动有趣一些,可能会选择增加gif文件到文章里面。但是,为了上传的速度够快,或者如果是用自己的服务器存储gif文件,我们肯定不希望gif文件过大,这时候就需要压缩gif文件。某些在线压缩gif的网站也的确好用,比如:
但对于某些过大的gif文件,它在完成压缩之后,我们有可能下载不下来。(这也许和网络有关,我就遇到过这类事情)
于是,再度发扬自立自足的精神,我们来用Python压缩Gif文件。毕竟,python除了不会生孩子,还有什么不会?
我们走起!
大体思路:用Python分析原始gif文件,然后依据多帧数据生成许许多多不同的png文件。接下来,我们删除部分图片,比如只使用索引值为奇数的png来合成新的gif(下面的代码所保留的png图片则是5n)。这样一来,图片的尺寸就小了。
#! /usr/local/bin/python3
# -*- coding: utf-8 -*-
from PIL import Image
import os
import imageio
def AnalysisGif( gifPath ):
image = Image.open(gifPath)
pngDir = gifPath[:-4]
if os.path.exists( pngDir ):
files = os.listdir( pngDir )
for file in files:
file = pngDir + "/" + file
os.remove( file )
os.rmdir( pngDir )
os.mkdir( pngDir )
try:
while True:
current = image.tell()
pngPath = pngDir+'/'+str(current)+'.png'
image.save( pngPath, quality = 100 )
image.seek( current+1 )
except EOFError:
print( EOFError )
pass
def Combine2Gif( folderPath, gifFilePath ):
files = os.listdir( folderPath )
pngFiles = []
for i in range(0, len(files), 5):
pngFiles.append( folderPath + "/" + ('%d.png' % i) )
GenerateGif( 0.1, gifFilePath, pngFiles )
def GenerateGif(step, gifPath, filterPngs):
images = []
for filePath in filterPngs:
images.append( imageio.imread(filePath) )
imageio.mimsave( gifPath, images, duration = step )
if __name__ == "__main__":
gifPath = "/Users/weiyang/Desktop/test.gif"
AnalysisGif( gifPath )
Combine2Gif( gifPath[:-4], gifPath[:-4]+"_result.gif" )
print( "== finished ==" )
如果对gif的质量要求不高,我们甚至可以用OpenCV把gif转成黑白样式。这需要提前为Python安装OpenCV库。如果你对这种方式感兴趣,可以浏览: