首页 / 知识
如何使用Python对GIF进行压缩
2023-11-12 13:47:00
一、背景
前天在给微信公众号上传文章的时候,文章里面有一个图片是gif的,在上传的过程中报错了,说是图片超大了。搜索之后发现图片需要小于5m。
那么问题就转化为怎么把当前的gif给缩减到5m以内本着有轮子用轮子,没有轮子造轮子的精神,网上搜索一番。
发现一些现象
1、压缩要不就是需要会员才能下载;
2、要不免费的只能压缩5m以下的。
考虑到能动手不花钱的本性,我觉得要自己搞一下。
知识背景:
众所周知,gif图就是由若干组图片组成的一种文件格式,有多张有一定差异的图片连续播放,间隔时间较小,欺骗了我们的眼睛和大脑,然后我们以为是一个完全连续的。其实就是一个类似快速翻书的操作。
二、方案选型
方案一
因为gif是有多种图片做的,那我们就考虑把图片减少一些,比如说原来是100张是10m,我给缩减到10张,那体积可不就要缩小到1m左右了吗?当然,为了用户看起来不是那么卡顿,我就拍脑袋给缩减到20张吧,即只有原来的1/5。
方案二
如果缩减的图片太多导致gif看起来卡顿的话,我们可以考虑不缩减图片的张数,但是我们可以压缩图片。
方案三
最后的都是重要的,如果前面两个都无法满足的话,那就可以考虑把他们进行叠加。先减张数,再压缩拆分的图片。
三、项目落实
整体流程如下:
if__name__=="__main__": #设置源gif的地址 sourceGifPath="/Users/user/test/f79a3e2c2e864863a6b1a66791cb0950_tplv-k3u1fbpfcp-watermark.webp" #将gif拆分成多个图片,并保存在本地 SplitGif(sourceGifPath) #将指定位置的文件下的图片按照文件名索引排序,做成gif Combine2Gif(sourceGifPath[:-4],sourceGifPath[:-4]+"_result.webp") print("==finished==")1、将源gif读入内存
2、将gif拆分成png,并保存
defSplitGif(gifPath): #获取png存储的文件夹的地址 pngDir=gifPath[:-4] #要存储的文件夹下清理干净,避免影响当前操作 rmPngDir(pngDir) #创建存储的文件夹 os.mkdir(pngDir) #把指定gif拆分后存储到指定文件夹 savePngToDir(gifPath,pngDir)2.1、获取要存储的地址
2.2、清空并移除存储png的文件夹
defrmPngDir(pngDir): ifos.path.exists(pngDir): files=os.listdir(pngDir) #如果不一个一个的移除文件夹下的文件的话,无法移除文件夹 forfileinfiles: file=pngDir+"/"+file os.remove(file) os.rmdir(pngDir)2.3、创建存储png的文件夹
2.4、将gif拆分成png,并保存
defsavePngToDir(gifPath,pngDir): #通过路径传教image对象 image=Image.open(gifPath) try: #循环,通过异常方案退出循环 whileTrue: #获取当前的索引的位置 current=image.tell() #创建文件路径 pngPath=pngDir+'/'+str(current)+'.webp' image.save(pngPath,quality=100) #索引后移,越界后异常,退出当前循环 image.seek(current+1) exceptEOFErrorase: print(e) pass3、按照一定的间隔读取2中的png,并生成gif
defCombine2Gif(folderPath,gifFilePath): GenerateGif(0.1,gifFilePath,getPngArray(folderPath))3.1、获取所有的png
defgetPngArray(folderPath): files=os.listdir(folderPath) pngFiles=[] #通过设置step,将文件的大小修改为原来的体积的1/step foriinrange(0,len(files),5): pngFiles.append(folderPath+"/"+('%d.webp'%i)) returnpngFiles3.2、将png合并成gif
defGenerateGif(step,gifPath,filterPngs): images=[] forfilePathinfilterPngs: images.append(imageio.imread(filePath)) #生成gif,duration是播放两个图片之间的间隔时间 imageio.mimsave(gifPath,images,duration=step)四、全部的代码
#!/usr/local/bin/python3 #-*-coding:utf-8-*- fromPILimportImage importos importimageio defSplitGif(gifPath): #获取png存储的文件夹的地址 pngDir=gifPath[:-4] #要存储的文件夹下清理干净,避免影响当前操作 rmPngDir(pngDir) #创建存储的文件夹 os.mkdir(pngDir) #把指定gif拆分后存储到指定文件夹 savePngToDir(gifPath,pngDir) defrmPngDir(pngDir): ifos.path.exists(pngDir): files=os.listdir(pngDir) #如果不一个一个的移除文件夹下的文件的话,无法移除文件夹 forfileinfiles: file=pngDir+"/"+file os.remove(file) os.rmdir(pngDir) defsavePngToDir(gifPath,pngDir): #通过路径传教image对象 image=Image.open(gifPath) try: #循环,通过异常方案退出循环 whileTrue: #获取当前的索引的位置 current=image.tell() #创建文件路径 pngPath=pngDir+'/'+str(current)+'.webp' image.save(pngPath,quality=100) #索引后移,越界后异常,退出当前循环 image.seek(current+1) exceptEOFErrorase: print(e) pass defCombine2Gif(folderPath,gifFilePath): GenerateGif(0.1,gifFilePath,getPngArray(folderPath)) #获取文件的数组 defgetPngArray(folderPath): files=os.listdir(folderPath) pngFiles=[] #通过设置step,将文件的大小修改为原来的体积的1/step foriinrange(0,len(files),5): pngFiles.append(folderPath+"/"+('%d.webp'%i)) returnpngFiles defGenerateGif(step,gifPath,filterPngs): images=[] forfilePathinfilterPngs: 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.webp" #将gif拆分成多个图片,并保存在本地 SplitGif(sourceGifPath) #将指定位置的文件下的图片按照文件名索引排序,做成gif Combine2Gif(sourceGifPath[:-4],sourceGifPath[:-4]+"_result.webp") print("==finished==")五、结尾
作为一个追求高效的程序员,我就做一个能满足我需求的方案,即方案一。至于方案二和方案三,有兴趣的朋友可以举一反三。
以上内容为大家介绍了如何使用Python对GIF进行压缩,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
linux命令代码怎么看?
linux命令代码怎么看?,时间,系统,代码,命令,状态,工具,情况,电脑,实时,基础,linux查看系统命令是什么有的,Linux中有多个命令可以用于查看文件python opencv如何旋转图片?
python opencv如何旋转图片?,中心,代码,图像,图片,角度,大小,函数,例子,正数,负数,OpenCV是一款开源的计算机视觉库,它提供了各种各样的图像处比较好用的Python代码编辑器
比较好用的Python代码编辑器,代码,平台,环境,培训,教育,设计,数据,办公,人员,分析,Python是一款非常简单的编程语言,其功能使用起来都十分方便报名Python培训选择哪种方式比较好
报名Python培训选择哪种方式比较好?,培训,工作,基础,时间,情况,在线,最划算,环境,系统,方式,Python不仅是一种高级的编程语言,而且还是一种应用深圳python培训课程哪家靠谱?
深圳python培训课程哪家靠谱?,深圳,人工智能,培训,检测,分析,实战,行业,转型,时间,体系,Python语言简单、易学、易读、易维护,学习成本和时间相学习Python有必要报培训班吗?
学习Python有必要报培训班吗?,项目,培训,企业,实战,行业,技术,做好,汽车,行情,体系,伴随着人工智能的广泛应用,Python被广泛应用于web开发、运Python的异常处理
Python的异常处理,异常,代码,信息,数据,名字,语句,文件,检测,培训,发生,什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,影响了程python能做什么项目
python能做什么项目,项目,数据,基础,图片,信息,工具,网站,概念,代码,基本知识,大家在学完python基础之后,突然迷茫起来了,这时就需要一些项目练Python初学者的练手项目
Python初学者的练手项目,项目,价格,服务,设备,数字货币,变动,工作,网站,工具,手机,有很多朋友问我学习了Python后,有没有什么好的项目可以练手十行Python代码替换证件照背景颜色
十行Python代码替换证件照背景颜色,照片,代码,培训,背景,颜色,思路,路径,步骤,红色,格式,本文教大家通过Python程序替换证件照背景颜色,以后更使用Python自动化测试iOS项目
使用Python自动化测试iOS项目,项目,代码,人员,数据,工程,名称,新增,最新,流程,名字,作为一个开发人员,为了保证自己的代码的健壮,写单元测试是为什么开发人员喜欢在机器学习和人
为什么开发人员喜欢在机器学习和人工智能项目中使用Python?,代码,项目,数据,人工智能,平台,异常,增长,灵活,时间,工具,1.Python是灵活的Pytho