背景:
移动端,我们的项目中会用到很多的本地图片,而这些图片在一定程度上会影响我们打出包的大小,我们肯定是希望我们本地的图片越小越好,但是前提是不能失真。
日常压缩图片工具
UI切完图之后,我一般会用TinyPNG将图片进行压缩一下然后再加进项目
TinyPNG使用智能有损压缩技术来减少PNG文件的文件大小。通过有选择地减少图像中的颜色数量,存储数据所需的字节数就会减少。效果是几乎看不见的,压缩大小差异很明显!
压缩的效果是杠杠的,而且肉眼感觉不到失真,并且一个图片进行重复压缩,会发现最终压不动了,还是挺不错的。
在线图片压缩网站的缺点
最多20张图片,每张最大5M
我们的项目至少得百张以上吧,如果20张20张的搞,挺麻烦的,而且还涉及到目录的问题<需要把最后的一层一个个择出来,并且压缩完,再搞回去>
以上的网站压缩方式,只适合UI给到开发几张图,当下就进行压缩,然后搞到项目,不适合批量压缩。
批量压缩流程
tinypng不仅提供了网页在线压缩,还支持工具压缩
工具压缩,一次性免费压缩500张,如果有一次性压缩大于500张的需求,是需要收费的
https://tinypng.com/developers
那么,tinypng如何保证你不会压缩超过500张呢?
用邮箱申请一个key,这个key在压缩的时候能统计你压缩的张数
换句话说,一个邮箱一个月可以免费压缩500张图片一次。
如果真有大于500张压缩需求,多申请几个key,分批压缩不就可以了😄
大体套路已经清楚了,接下来使用他的工具
工具篇
他支持的平台还是很多的
Ruby, PHP, Node.js, Python, Java, .NET, WordPress plugin
这里我们用Python
https://tinypng.com/developers/reference/python
1.1、安装相关的包
pip3 install --upgrade tinify
tinify如果安装失败,参考https://www.jianshu.com/p/3c71b9be3a51。我安装失败了,源的事儿。
1.2、tinify 使用
import tinify
# YOUR_API_KEY 就是上面我们申请的key
tinify.key = "YOUR_API_KEY"
source = tinify.from_file("unoptimized.jpg")
source.to_file("optimized.jpg")
就是上面简单的几句话,可以用来压缩一张图片。我们需要的是批量操作
那就是根据目录查找所有要压缩的图片,蹂躏这个方法了。
自定义脚本
这里写了两个Python脚本
FindAllImages.py
用来分析文件构成,当前文件大小,文件数量,图片数量<看看key对应的压缩数量还够不够用😄>,png数量,jpg数量,异常文件等...
主要目的是为了给压缩后的结果进行对比,别压缩完了发现文件数量不一致了,这个就尴尬了
python3 FindAllImages.py -f /Users/a58/Desktop/Tools/TestFile
参数说明:
-f 要检测的文件路径
CompressImages.py
这个脚本主要是用来压缩的,在压缩之前会先调用上面的FindAllImages.py脚本,先了解文件组成情况,然后询问用户是否继续。
为啥要询问呢,主要是如果要压缩的文件中存在其他的类型文件,需要处理的话,可以临时中断处理,处理完了在进行压缩。和key对应的文件数量够不够用的,不够就分批进行。
python3 CompressImages.py -k jSrjT94QC4f4Sdqn0JFTrclj2tbXxWh3 -f /Users/a58/Desktop/Tools/TestFile -t /Users/a58/Desktop/Tools/FinalFile
参数说明:
-k tinify平台申请的key
-f 要压缩的文件路径<对于iOS项目来说,就可以直接把Assets.xcassets扔进去了>
-t 压缩文件存储路径
如果要进行检测压缩一条龙,直接运行 CompressImages.py即可
最终实现效果
压缩文件对象
1、直接使用上面的脚本压缩【Assets.xcassets】下的图片
2、项目中bundle中的图片,单独的压缩
3、项目中存在的图片,通过脚本进行查找,单独压缩
真实项目压缩效果:压缩前 12.4MB 压缩后 5.4M
脚本地址