【问题标题】:Prevent imagemagick from mogrifing an image twice防止 imagemagick 两次修改图像
【发布时间】:2021-06-04 22:51:54
【问题描述】:

所以我有一个包含很多图像的文件夹。我使用 imagemagick 来优化文件夹内的所有图像。我中止了“优化”图像的命令。现在。一些图像已经过优化,但不是全部。所以我必须再次运行该命令。有没有办法让 imagemagick 跳过已经优化的图像?

这是我通常用来优化所有图像的方法:

for i in *.jpg; do mogrify -quality 85 "$i"; done

【问题讨论】:

  • 我不知道 ImageMagick 有什么方法可以知道您已经处理了一个文件。但是您的命令效率不高。您正在使用 mogrify 处理一个文件,然后遍历所有文件。 mogrify 的目的是自己处理整个文件夹的文件。所以要么在循环中使用 convert 代替 mogrify 。或者只使用 mogrify 在一个命令中处理文件夹中的所有文件,而无需循环。见legacy.imagemagick.org/Usage/basics/#mogrify
  • 当我不使用循环命令时,我得到:debian 中的参数列表太长。您对如何以其他方式进行操作有什么建议吗?导致 60k 图像太多(即使您使用 mv 或 rm 之类的简单命令)
  • 那么我建议您只需将 mogrify 替换为 convert 并保留循环。它不会对您有太大变化,但 convert 更灵活。因此,如果您有更复杂的命令,它会起作用,但 mogrify 可能不会。使用语法convert input -quality 85 output,其中输出可以与输入相同。或者只是让你的 mogrify 保持简单的命令。我建议你两者都计时,看看哪个更有效。
  • 另一个想法。您可以在处理之前检查图像的质量。如果小于等于 85,则不要处理。

标签: debian imagemagick mogrify


【解决方案1】:

如果您有数以万计的图像要处理,并且有一台相当现代的机器(即多核 CPU 和良好的 RAM 和磁盘),您可以考虑 GNU Parallel

基本上,如果文件名超过系统的 ARGMAX 限制,您需要将文件名通过管道传输到 GNU Parallel。最好使用以 null 结尾的名称,以便包含空格的文件名继续有效,因此您需要:

find . -name \*.jpg -print0 | parallel -0 --dry-run mogrify -quality 85 {}

如果看起来正确,您可以删除 --dry-run 并再次运行它。实际上,如果您的 CPU 有 4 个内核,这将使 mogrify 的 4 个副本并行运行 - 即它会使它们都处于忙碌状态,并且应该更快地处理您的图像,但是,它并不是最有效的,因为它启动了一个整体为每个图像添加新的mogrify 进程,最好将-X 添加到GNU Parallel,然后它将以您的操作系统可以处理的尽可能多的文件名和启动成本来启动mogrify一个过程将分摊到大量图像上。那将是:

find . -name \*.jpg -print0 | parallel -0 -X mogrify -quality 85 {}

在您的数据的副本上体验任何新软件 - GNU Parallel 可以非常快速地做很多事情 - 好事和坏事!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2011-07-11
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多