OptiPNG和jpegoptim工具来可以对图片进行无损压缩,于是xiaoz在此基础上编写了一个shell脚本来调用OptiPNG、jpegoptim工具自动完成批量压缩图片。

【开源】Linux环境下,自动批量压缩图片的解决方案-LMLPHP

目前支持.jpg/.jpeg/.bmp/.png格式图片

安装OptiPNG和jpegoptim

Shell脚本需要调用OptiPNG和jpegoptim这两个工具,安装OptiPNG、jpegoptim是必须的,这里仅以CentOS为列,其它Linux系统可自行搜索安装。

  1. #安装epel源
  2. yum -y install epel-release
  3. #安装OptiPNG
  4. yum -y install optipng
  5. #安装jpegoptim
  6. yum -y install jpegoptim

复制代码

调用shell脚本批量压缩

  1. #下载批量压缩脚本
  2. wget https://raw.githubusercontent.com/helloxz/shell/master/img_compress.sh
  3. #执行shell脚本
  4. bash img_compress.sh /data/wwwroot/imgurl

复制代码

其中/data/wwwroot/imgurl修改为自己的图片目录(需要使用绝对路径)

crontab定时执行

  1. #先将脚本赋予执行权限
  2. chmod +x img_compress.sh
  3. #添加定时任务
  4. crontab -e
  5. #将内容复制到最后并保存(每小时执行一次)
  6. */60  * * * * /yourpath/img_compress.sh /data/wwwroot/imgurl > /dev/null
  7. #重载crontab
  8. service crond reload

复制代码

更多说明请参考原文:https://www.xiaoz.me/archives/13511
脚本地址:https://github.com/helloxz/shell/blob/master/img_compress.sh
云南网友:
搜索看了一眼,比你脚本更简单

首先真是不明白,用centos用什么第三方库? 用centos用第三方库为什么不干脆直接用 debian ?用centos你是图什么,不就图centos万年不更的老库,免维护嘛。

安装

  1. apt install optipng jpegoptim

复制代码
压缩命令:

  1. find . -iname ‘*.png’ -print0 | xargs -0 optipng -o7 -preserve
  2. find . -iname ‘*.jpg’ -print0 | xargs -0 jpegoptim –strip-all –preserve –totals –all-progressive

复制代码
上面是遍历目录的,也可以指定目录:images_folder改成自己的

  1. find images_folder/ *.{jpeg,jpg} -exec jpegoptim {} \;
  2. find images_folder/ *.png -exec optipng {} \;

复制代码
什么,命令长?命令不用记,自己写入 .bashrc  替换成简单命令就可以了,之后用 pngz , jpgz 命令就是了

  1. alias pngz=’find . -iname ‘*.png’ -print0 | xargs -0 optipng -o7 -preserve’
  2. alias jpgz=’find . -iname ‘*.jpg’ -print0 | xargs -0 jpegoptim –strip-all –preserve –totals –all-progressive’

复制代码

河南网友:前排花生牛奶洗面奶
澳门网友:
先mark 找机会试试

有没有压缩前后对比啊
山东网友:自己跑一下脚本就可以对比了,这是我执行后的部分结果。另外也可以适当修改下脚本提高压缩级别(级别越高越吃CPU)

  1. /data/wwwroot/imgurl/imgs/2019/08/c4719f67827b47b5.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 409022 –> 136213 bytes (66.70%), optimized.
  2. /data/wwwroot/imgurl/imgs/2019/08/97e5c418839595f8.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 409641 –> 143095 bytes (65.07%), optimized.
  3. /data/wwwroot/imgurl/imgs/2019/08/cd1337dbe4a9de63.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 369246 –> 130287 bytes (64.72%), optimized.
  4. /data/wwwroot/imgurl/imgs/2019/08/643a8733650289fc.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 469150 –> 182604 bytes (61.08%), optimized.
  5. /data/wwwroot/imgurl/imgs/2019/08/3fa4595aafbdcec4.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 498075 –> 193409 bytes (61.17%), optimized.
  6. /data/wwwroot/imgurl/imgs/2019/08/6b3a4381757675e0.jpg 776×1173 24bit N JFIF  [OK] 294311 –> 212403 bytes (27.83%), optimized.
  7. /data/wwwroot/imgurl/imgs/2019/08/c04b62741e71b4ab.jpg 2208×1242 24bit N Exif IPTC JFIF  [OK] 502573 –> 197138 bytes (60.77%), optimized.
  8. /data/wwwroot/imgurl/imgs/2019/08/cc3e5311aa96dcd1.jpg 2560×1440 24bit N JFIF  [OK] 787748 –> 162981 bytes (79.31%), optimized.
  9. /data/wwwroot/imgurl/imgs/2019/08/f1c439711b64a9f1.jpg 1229×1410 24bit N JFIF  [OK] 308777 –> 136253 bytes (55.87%), optimized.
  10. /data/wwwroot/imgurl/imgs/2019/08/74c80a3b91d20c4e.jpg 1386×1920 24bit N Exif JFIF  [OK] 241196 –> 241196 bytes (0.00%), skipped.
  11. /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

  1. 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命令的话要分别执行几个,写个脚本再配合定时任务方便一点。

01-30 21:10