最近需要优化程序大小,想着先从图片资源入手,正好有一个图片压缩网站 https://tinypng.com/。因此写了个shell脚本实现扫描需要压缩的图片并且上传到该网站压缩并下载压缩后的图片功能。
-
首先需要登录该压缩网站获取一个API Key
创建一个compress.sh文件,并把下面的内容复制粘贴
#sh compress.sh directory size
#for example: sh compress.sh . +50k
#默认directory为当前目录、size为+50k
size=$2
#if [[ size="" ]]; then
# size=+50k
#fi
directory=$1
#if [[ directory="" ]]; then
# directory=.
#fi
result=$(find $directory \( -path '*/build' -prune -o -path '*/Docs' -prune \) -o \( -name *.png -o -name *.jpg \) -size $size -print)
function compress {
YOUR_API_KEY=abcdefghijklmnopqrstuvwxyz012345...
pic_path=$1
echo " start compress for $pic_path "
result=$(curl https://api.tinify.com/shrink \
--user api:$YOUR_API_KEY \
--data-binary @$pic_path)
# result="{"input":{"size":69178,"type":"image/png"},"output":{"size":22121,"type":"image/png","width":720,"height":1500,"ratio":0.3198,"url":"https://api.tinify.com/output/8j7tr7mkygc0je25gf5ag792ekd6jt48"}}"
# grep -P 'http[^"]*"' $result -o
pic_url=$(echo $result | sed 's/.*\(http[^"}]*\).*/\1/g')
# pic_path=./screen.png
#https://api.tinify.com/output/8j7tr7mkygc0je25gf5ag792ekd6jt48
# echo $pic_url
curl $pic_url \
--user api:$YOUR_API_KEY \
--output ${pic_path}.compress
echo " compress success for $pic_path "
}
OLD_IFS="$IFS"
IFS=" "
array=($result)
IFS="$OLD_IFS"
for path in ${array[@]}
do
compress $path
# echo $path #./Module_Base/src/main/res/drawable-xxhdpi/icon_newuser_first_page1.png
done
# echo $result
echo shell =\> finish
- 将获取的API Key替换compress.sh文件中的abcdefghijklmnopqrstuvwxyz012345...字符串
- 最后就是尽情的使用了
sh compress.sh ${要扫描的目录} ${大小限制}
比如:sh compress.sh . +50k
表示扫描当前文件夹(包括子文件夹)下的所有大小大于50k的jpg和png图片并压缩。
可以明显的看到 pic_login_bg.jpg文件由59077B变为了41957B,压缩率还是很明显的。
该shell会在当前待压缩图片的目录中生成一个 .compress
后缀的压缩后图片,如果对压缩后的图片满意,重命名去掉 .compress
后缀即可。
- 注意事项
当你想过滤某些文件夹(不必进行压缩,所以都不必需要扫描)。你可以对源码的result=$(find $directory \( -path '*/build' -prune -o -path '*/Docs' -prune \) -o \( -name *.png -o -name *.jpg \) -size $size -print)
该行进行修改。
简单提下,-path '*/build' -prune -o -path '*/Docs' -prune
这一段代码就是过滤所有 build文件夹和 Docs文件夹下的图片。