我有一个托管在共享托管程序包上的网站。 我正在使用Imagick压缩网站jpg和jpeg上大小超过100kb的所有图像,我使用的命令是: 对于JPG:
nice -n 15 find . -type f -size +100000c -name '*.jpg' -exec convert {} -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB {} \;
对于:JPEG
nice -n 15 find . -type f -size +100000c -name '*.jpeg' -exec convert {} -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB {} \;
我在cpanel的cron作业中设置了这两个命令,每天运行一次。
问题是,如果我有一个尺寸很大的图像(例如大于1Mb),并且压缩的图像仍大于100kb,脚本将对其反复应用压缩,直到小于100kb。这导致非常低的分辨率和不良的质量。 我如何告诉imagick命令仅压缩以前未压缩的图像。我本来想只查找过去24小时修改过的文件,但我认为这不是正确的解决方案,因为运行脚本时会花费时间,而新压缩的图像可能会在同一24小时内。
我认为可行的解决方案是使用“ identify -verbose”来检查图像质量,如果它是85%,则不要压缩。我怎么能在上面相同的代码中写这个。或者,如果您有任何其他解决方案,我们将不胜感激。
环顾四周,我发现了一个建议的解决方案,但我需要使代码正常工作,如下所示:
nice -n 15 find . -type f -size +100000c -name '*.jpg' | [[ $(identify -format %c {}) != *optimised* ]] && { echo Optimising {}; convert {} -set comment "optimised" -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB {} \; }
我对此代码有问题,通常将查找结果的返回存储在{}中,但在这种情况下它显示错误。 您能解决这个问题并使它起作用吗?
答案 0 :(得分:1)
假定您无法重命名图像或维护已压缩图像的第二个索引。我建议不要依赖quality
值,而建议探索更新/评估图像的元数据(例如“评论”或“关键字”)。
Imagemagick的identify
程序允许您列出/更新元数据。
文档:
答案 1 :(得分:0)
我终于能够做到这一点,我创建了一个命令,可以将其放置在cpanel的cron选项卡中,并将能够压缩Web服务器上的所有图像。我考虑到Web服务器在资源不足的情况下可能运行缓慢,因此我使用命令“ nice -15”来防止该脚本使服务器CPU和内存过载。我也将其设置为每24小时运行一次,并添加了一个条件,即如果图像已被压缩,请勿再次对其进行压缩。只需在cpanel中的php中启用imagick,然后转到cron选项卡并添加以下命令:
nice -n 15 find . -type f -size +100000c -name "*.jpg" -exec bash -c '[[ $(identify -format "%c" "{}") != *optimised* ]] && { echo Optimising "{}"; convert "{}" -filter Triangle -sampling-factor 4:2:0 -define filter:support=2 -unsharp 0.25x0.25+8+0.065 -dither None -quality 85 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace RGB -strip -set comment "optimised" "{}"; }' \;
此命令适用于jpg,jpeg和png。 jsut将“ .jpg”内的字符串替换为您要压缩的图像格式。您可以在此处将所需的质量设置为85,我添加的Imagick选项来自我在互联网上找到的旧帖子,但是我对其进行了修改,因为如果压缩的文件大于1mb,则将花费10到20分钟压缩它是因为我从上面的代码中删除了“ -posterize 136”选项。 您可以为此命令添加一个选项,以仅查找在过去24小时内被修改过的文件才能使用,这样以前压缩的图像将仅通过此命令两次,该命令第三次运行时将不通过该图像在三天前压缩到命令的其余部分(不会输入条件来检查它是否已优化),这将加快处理服务器中所有文件的过程,请选中此选项(“ -mmin n”数据在n分钟前被最后修改)。
完成此操作后,我需要帮助优化此命令以提供最佳的压缩图片质量,并且如果有任何人可以帮助您使用“调整大小”选项来调整仅大于屏幕宽度和高度的图像的大小(图像例如横幅广告),其余图片保留默认大小。