OptiPNG和jpegoptim工具来可以对图片进行无损压缩,于是xiaoz在此基础上编写了一个shell脚本来调用OptiPNG、jpegoptim工具自动完成批量压缩图片。
目前支持.jpg/.jpeg/.bmp/.png格式图片
安装OptiPNG和jpegoptim
Shell脚本需要调用OptiPNG和jpegoptim这两个工具,安装OptiPNG、jpegoptim是必须的,这里仅以CentOS为列,其它Linux系统可自行搜索安装。
- #安装epel源
- yum -y install epel-release
- #安装OptiPNG
- yum -y install optipng
- #安装jpegoptim
- yum -y install jpegoptim
复制代码
调用shell脚本批量压缩
- #下载批量压缩脚本
- wget https://raw.githubusercontent.com/helloxz/shell/master/img_compress.sh
- #执行shell脚本
- bash img_compress.sh /data/wwwroot/imgurl
复制代码
其中/data/wwwroot/imgurl修改为自己的图片目录(需要使用绝对路径)
crontab定时执行
- #先将脚本赋予执行权限
- chmod +x img_compress.sh
- #添加定时任务
- crontab -e
- #将内容复制到最后并保存(每小时执行一次)
- */60 * * * * /yourpath/img_compress.sh /data/wwwroot/imgurl > /dev/null
- #重载crontab
- service crond reload
复制代码
更多说明请参考原文:https://www.xiaoz.me/archives/13511
脚本地址:https://github.com/helloxz/shell/blob/master/img_compress.sh
云南网友:
搜索看了一眼,比你脚本更简单
首先真是不明白,用centos用什么第三方库? 用centos用第三方库为什么不干脆直接用 debian ?用centos你是图什么,不就图centos万年不更的老库,免维护嘛。
安装
- apt install optipng jpegoptim
复制代码
压缩命令:
- find . -iname ‘*.png’ -print0 | xargs -0 optipng -o7 -preserve
- find . -iname ‘*.jpg’ -print0 | xargs -0 jpegoptim –strip-all –preserve –totals –all-progressive
复制代码
上面是遍历目录的,也可以指定目录:images_folder改成自己的
- find images_folder/ *.{jpeg,jpg} -exec jpegoptim {} \;
- find images_folder/ *.png -exec optipng {} \;
复制代码
什么,命令长?命令不用记,自己写入 .bashrc 替换成简单命令就可以了,之后用 pngz , jpgz 命令就是了
- alias pngz=’find . -iname ‘*.png’ -print0 | xargs -0 optipng -o7 -preserve’
- alias jpgz=’find . -iname ‘*.jpg’ -print0 | xargs -0 jpegoptim –strip-all –preserve –totals –all-progressive’
复制代码
河南网友:前排花生牛奶洗面奶
澳门网友:
先mark 找机会试试
有没有压缩前后对比啊
山东网友:自己跑一下脚本就可以对比了,这是我执行后的部分结果。另外也可以适当修改下脚本提高压缩级别(级别越高越吃CPU)
- /data/wwwroot/imgurl/imgs/2019/08/c4719f67827b47b5.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 409022 –> 136213 bytes (66.70%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/97e5c418839595f8.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 409641 –> 143095 bytes (65.07%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/cd1337dbe4a9de63.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 369246 –> 130287 bytes (64.72%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/643a8733650289fc.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 469150 –> 182604 bytes (61.08%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/3fa4595aafbdcec4.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 498075 –> 193409 bytes (61.17%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/6b3a4381757675e0.jpg 776×1173 24bit N JFIF [OK] 294311 –> 212403 bytes (27.83%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/c04b62741e71b4ab.jpg 2208×1242 24bit N Exif IPTC JFIF [OK] 502573 –> 197138 bytes (60.77%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/cc3e5311aa96dcd1.jpg 2560×1440 24bit N JFIF [OK] 787748 –> 162981 bytes (79.31%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/f1c439711b64a9f1.jpg 1229×1410 24bit N JFIF [OK] 308777 –> 136253 bytes (55.87%), optimized.
- /data/wwwroot/imgurl/imgs/2019/08/74c80a3b91d20c4e.jpg 1386×1920 24bit N Exif JFIF [OK] 241196 –> 241196 bytes (0.00%), skipped.
- /data/wwwroot/imgurl/imgs/2019/08/93f17bbf3f4e00d0.jpg 1056×984 24bit N Exif JFIF [OK] 231805 –> 115288 bytes (50.27%), optimized.
复制代码
重庆网友:是否会检查,压缩过的第二次会跳过吧,不然会浪费时间
湖南网友:脚本默认查找60分钟以内曾被修改过的图片文件(再加上定时任务1小时执行一次,这样就不会去压缩重复的图片),并且大于100kb的图片才会进行压缩,您也可以下载脚本后对这些设定自行做出修改(图片的压缩等级也可以适当修改)。
上海网友:什么时候把功能整合进图床,brotli不够用了
新疆网友:向大佬学习
江苏网友: 悄咪咪问下楼主 那个目录是图片存放的目录吗?会自动找其他子文件夹不?我大文件夹里面有三千子文件夹。。。。里面有十万左右的图片
新疆网友: 悄咪咪问下楼主 那个目录是图片存放的目录吗?会自动找其他子文件夹不?我大文件夹里面有三千子文件夹。。。。里面有十万左右的图片
浙江网友:以前发了个贴,/thread-548854-1-1.html
其实一行命令就好了没必要单独写个脚本,配合cpulimit更佳以防小鸡被ban
- find /www/wwwroot/file/img -mtime -2 -iname ‘*.jpg’ -print0 | xargs -0 mogrify -resize 680×510 -quality 60 -auto-orient & sleep 3 && cpulimit -e mogrify -l 30 -z
复制代码
上海网友:不知道压缩后的文件名称有没有改变?
求一个压缩不改变文件名的方案(直接替换掉原文件,保留相同文件名)
黑龙江网友:默认就是不改变文件名的。
江苏网友:脚本默认就是覆盖原文件啊
甘肃网友:主要是根据不同的后缀调用不同的压缩工具,同时支持压缩.bmp .png .jpg命令的话要分别执行几个,写个脚本再配合定时任务方便一点。