很多情况下我们都需要对图片进行压缩。在项目中,可以减少安装包的体积;上传到图床,生成链接,可以使用更少的带宽和更快的负载。

一、TinyPng

TinyPng,使用智能有损压缩技术来减少 PNG文件的文件大小。通过选择性地减少图像中的颜色数量,需要较少的字节来存储数据。效果几乎是看不见的,但它在文件大小上有很大差异!

TinyPng 广受好评的同时,也提供相应的API供我们使用。不过TinyPng有个限制,单个账号单月最多压缩500张图片。如果不够用,可以多申请几个账号多获取几个APIKey。

二、实现思路

遍历给定的文件夹,如果是图片,使用 TinyPng 提供的API进行压缩,将压缩后的图片下载并保存到指定的目录;如果是文件夹,再进行更深一层的遍历,查找图片并进行压缩保存。

2.1 获取APIKey

点击进入Developer API获取 API Key

2.2 Shell脚本

具体的脚本如下:

注意:

  • 脚本中的 tinyApiKey 用自己在 TinyPng 获取的 API Key 替换;
  • 脚本中的 imagePath 为需要压缩的图片所在的文件夹路径;
  • 如果需要设置图片输出路径,可以配置 outputPath;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/bin/bash
imageNumber=0;
tinyApi="https://api.tinify.com/shrink";
tinyApiKey="";
imagePath="";
outputPath="./tinyImage";
checkImageNumber() {
currentImagePath=$1
for file in `ls ${currentImagePath}`; do
if [ -f ${currentImagePath}/${file} ]; then
# 判断是否为图片类型
if [ ${file##*.} == "png" ] || [ ${file##*.} == "PNG" ] || [ ${file##*.} == "jpg" ] || [ ${file##*.} == "JPG" ] ; then
imageNumber=`expr ${imageNumber} + 1`
fi
else
checkImageNumber "${currentImagePath}/${file}"
currentImagePath=${imagePath}
fi
done
}
outputImageUrl() {
imageUrl=`echo $1 | sed 's/.*"url":"\(.*\)"}}/\1/g'`
echo ${imageUrl}
}
tinyImage() {
currentImagePath=$1
for file in `ls ${currentImagePath}`; do
if [ -f ${currentImagePath}/${file} ]; then
# 判断是否为图片类型
if [ ${file##*.} == "png" ] || [ ${file##*.} == "PNG" ] || [ ${file##*.} == "jpg" ] || [ ${file##*.} == "JPG" ] ; then
resules=$(curl ${tinyApi} \
--user api:${tinyApiKey} \
--data-binary "@${currentImagePath}/${file}")
outputImageUrl=$(outputImageUrl ${resules})
echo "URL: ${outputImageUrl}"
if [[ -n ${outputImageUrl} ]]; then
curl "${outputImageUrl}" \
--user api:${tinyApiKey} \
--output ${outputPath}/${file}
fi
fi
else
tinyImage "${currentImagePath}/${file}"
currentImagePath=${imagePath}
fi
done
}
if [ -d ${outputPath} ]; then
rm -rf ${outputPath}
fi
mkdir ${outputPath}
checkImageNumber ${imagePath}
echo "图片数量:${imageNumber}"
tinyImage ${imagePath}

2.3 使用

进入脚本所在的目录

1
$ cd /Users/xiao/Desktop/TinyPng

如果是第一次执行需要先赋予执行权限,然后再执行脚本

1
chmod +x inyImages.sh

执行脚本

1
./tinyImages.sh

执行过程中,默认会在与脚本相同的目录下新建一个 TinyImage 文件夹,所有压缩后的图片都保存在这个文件夹下。如果修改过 outputPath,图片会保存到你配置的路径下。