设为首页收藏本站

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 87|回复: 13

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

[复制链接]

49

主题

666

回帖

1591

积分

金牌会员

积分
1591
发表于 2019-8-23 13:34:18 | 显示全部楼层 |阅读模式
OptiPNG和jpegoptim工具来可以对图片进行无损压缩,于是xiaoz在此基础上编写了一个shell脚本来调用OptiPNG、jpegoptim工具自动完成批量压缩图片。





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


安装OptiPNG和jpegoptim

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

[ol]
  • #安装epel源
  • yum -y install epel-release
  • #安装OptiPNG
  • yum -y install optipng
  • #安装jpegoptim
  • yum -y install jpegoptim[/ol]复制代码

    调用shell脚本批量压缩

    [ol]
  • #下载批量压缩脚本
  • wget https://raw.githubusercontent.com/helloxz/shell/master/img_compress.sh
  • #执行shell脚本
  • bash img_compress.sh /data/wwwroot/imgurl[/ol]复制代码

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

    crontab定时执行

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

    更多说明请参考原文:https://www.xiaoz.me/archives/13511
    脚本地址:https://github.com/helloxz/shell/blob/master/img_compress.sh
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×
    回复

    使用道具 举报

    343

    主题

    2542

    回帖

    6197

    积分

    论坛元老

    积分
    6197
    发表于 2019-8-23 14:14:35 | 显示全部楼层
    本帖最后由 aming 于 2019-8-23 14:27 编辑

    搜索看了一眼,比你脚本更简单

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

    安装
    [ol]
  • apt install optipng jpegoptim[/ol]复制代码

    压缩命令:

    [ol]
  • find . -iname '*.png' -print0 | xargs -0 optipng -o7 -preserve
  • find . -iname '*.jpg' -print0 | xargs -0 jpegoptim --strip-all --preserve --totals --all-progressive[/ol]复制代码

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

    [ol]
  • find images_folder/ *.{jpeg,jpg} -exec jpegoptim {} \;
  • find images_folder/ *.png -exec optipng {} \;[/ol]复制代码

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

    [ol]
  • 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'[/ol]复制代码
  • 回复

    使用道具 举报

    165

    主题

    1806

    回帖

    4269

    积分

    论坛元老

    积分
    4269
    发表于 2019-8-23 14:16:00 | 显示全部楼层
    前排花生牛奶洗面奶
    回复

    使用道具 举报

    4

    主题

    1268

    回帖

    2644

    积分

    金牌会员

    积分
    2644
    发表于 2019-8-23 13:37:15 | 显示全部楼层
    本帖最后由 hlsk 于 2019-8-23 13:44 编辑

    先mark 找机会试试

    有没有压缩前后对比啊
    回复

    使用道具 举报

    49

    主题

    666

    回帖

    1591

    积分

    金牌会员

    积分
    1591
     楼主| 发表于 2019-8-23 13:42:42 | 显示全部楼层

    hlsk 发表于 2019-8-23 13:42

    先mark 找机会试试

    有没有压缩前后对比啊

    自己跑一下脚本就可以对比了,这是我执行后的部分结果。另外也可以适当修改下脚本提高压缩级别(级别越高越吃CPU)
    [ol]
  • /data/wwwroot/imgurl/imgs/2019/08/c4719f67827b47b5.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 409022 --> 136213 bytes (66.70%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/97e5c418839595f8.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 409641 --> 143095 bytes (65.07%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/cd1337dbe4a9de63.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 369246 --> 130287 bytes (64.72%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/643a8733650289fc.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 469150 --> 182604 bytes (61.08%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/3fa4595aafbdcec4.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 498075 --> 193409 bytes (61.17%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/6b3a4381757675e0.jpg 776x1173 24bit N JFIF  [OK] 294311 --> 212403 bytes (27.83%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/c04b62741e71b4ab.jpg 2208x1242 24bit N Exif IPTC JFIF  [OK] 502573 --> 197138 bytes (60.77%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/cc3e5311aa96dcd1.jpg 2560x1440 24bit N JFIF  [OK] 787748 --> 162981 bytes (79.31%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/f1c439711b64a9f1.jpg 1229x1410 24bit N JFIF  [OK] 308777 --> 136253 bytes (55.87%), optimized.
  • /data/wwwroot/imgurl/imgs/2019/08/74c80a3b91d20c4e.jpg 1386x1920 24bit N Exif JFIF  [OK] 241196 --> 241196 bytes (0.00%), skipped.
  • /data/wwwroot/imgurl/imgs/2019/08/93f17bbf3f4e00d0.jpg 1056x984 24bit N Exif JFIF  [OK] 231805 --> 115288 bytes (50.27%), optimized.[/ol]复制代码
  • 回复

    使用道具 举报

    343

    主题

    2542

    回帖

    6197

    积分

    论坛元老

    积分
    6197
    发表于 2019-8-23 13:54:46 | 显示全部楼层
    是否会检查,压缩过的第二次会跳过吧,不然会浪费时间
    回复

    使用道具 举报

    49

    主题

    666

    回帖

    1591

    积分

    金牌会员

    积分
    1591
     楼主| 发表于 2019-8-23 13:42:00 | 显示全部楼层

    aming 发表于 2019-8-23 14:02

    是否会检查,压缩过的第二次会跳过吧,不然会浪费时间

    脚本默认查找60分钟以内曾被修改过的图片文件(再加上定时任务1小时执行一次,这样就不会去压缩重复的图片),并且大于100kb的图片才会进行压缩,您也可以下载脚本后对这些设定自行做出修改(图片的压缩等级也可以适当修改)。
    回复

    使用道具 举报

    9

    主题

    542

    回帖

    1193

    积分

    金牌会员

    积分
    1193
    发表于 2019-8-23 14:02:28 | 显示全部楼层
    什么时候把功能整合进图床,brotli不够用了

    回复

    使用道具 举报

    0

    主题

    23

    回帖

    72

    积分

    注册会员

    积分
    72
    发表于 2019-8-23 14:08:46 | 显示全部楼层
    向大佬学习
    312633180 发表于 2019-8-23 14:24

    悄咪咪问下楼主  那个目录是图片存放的目录吗?会自动找其他子文件夹不?我大文件夹里面有三千子文件 ...

    就是图片存储目录,会递归寻找子目录。不过脚本默认只查找60分钟内修改(上传)的图片,如果你要处理之前的图片需要修改脚本。另外建议你在测试环境运行,确保ok了再去操作正式环境,因为图片是直接覆盖的。
    回复

    使用道具 举报

    0

    主题

    1

    回帖

    4

    积分

    新手上路

    积分
    4
    发表于 2019-8-23 14:02:00 | 显示全部楼层
    以前发了个贴,https://www.52.ht/thread-548854-1-1.html
    其实一行命令就好了没必要单独写个脚本,配合cpulimit更佳以防小鸡被ban
    [ol]
  • find /www/wwwroot/file/img -mtime -2 -iname '*.jpg' -print0 | xargs -0 mogrify -resize 680x510 -quality 60 -auto-orient & sleep 3 && cpulimit -e mogrify -l 30 -z[/ol]复制代码
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Discuz! X

    GMT+8, 2026-2-14 10:06 , Processed in 0.029891 second(s), 8 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表