【问题标题】:Compressing images on my Server website ONCE ONLY仅在我的服务器网站上压缩图像一次
【发布时间】:2019-05-20 12:41:24
【问题描述】:

我有一个托管在共享主机包上的网站。 我正在使用 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。这会导致非常低的 wwww 分辨率和质量差。 我如何告诉 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 {} \; }

我对这段代码有问题,查找的返回通常存储在 {} 中,但在这种情况下它显示错误。 你能解决这个问题并让它发挥作用吗?

【问题讨论】:

    标签: php cron webserver hosting imagick


    【解决方案1】:

    假设您无法重命名图像或维护已压缩图像的第二个索引。我建议不要依赖 quality 值来探索更新/评估图像的元数据(如“评论”或“关键字”)。

    Imagemagick 的identify 程序允许您列出/更新元数据。

    文档:

    【讨论】:

    • ImageMagick 可以使用 identify -verbose image 从文件的详细信息中显示压缩方法和/或质量值。但正如Emilio Borraz 所说,最好的方法是在创建图像时将评论(或标签)放入图像的元数据中。 ImageMagick 可以使用convert image -set comment "your comment" image 做到这一点。然后,您可以通过将其读取为convert image -format "%c" info:identify -format "%c" image 来测试该命令。但是你最好使用 EXIFTOOL 来完成这一切。
    • 我同意你的看法,添加评论或使用识别来找出哪些图像已经压缩。但是我怎样才能做到这一点并将其应用到上面写的相同命令中。如您所见,我每 24 小时在 cron 作业中使用一个命令进行压缩,那么我如何告诉该命令在压缩之前检查此注释?
    【解决方案2】:

    我终于可以做到了,我创建了一个命令,您可以将其放置在您的 cpanel 的 cron 选项卡中,并且能够压缩您的网络服务器上的所有图像。我考虑到 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 分钟前)。

    完成此操作后,我需要帮助优化此命令以提供最佳压缩图片质量,如果有人可以帮助使用“调整大小”选项来调整仅大于屏幕宽度和高度的图像(图像像横幅),其余的图像保持默认大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2020-05-30
      • 2017-02-01
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多