如何将一个输入文件用于多个单独的操作

如何将一个输入文件用于多个单独的操作

我想读取一个文件,对其进行多个不同参数的操作,最后将每个输出保存为单独的文件。

目前我按照下面的代码片段所示执行此操作。这会在每次迭代时读取图像,而实际上我不会更改它。对于较大的图像(此处为 400 MB),它会变得非常缓慢。内存足够大,将其加载到内存中并从内存中处理一次就可以了。但我不确定如何做到这一点。不在 shell 中,也不在 ImageMagick 中。

  1. 有没有一种ImageMagick本地方法可以做到这一点?
  2. 在内存映射文件系统上复制一次文件并使用下面的脚本是最简单的吗?
#!/bin/sh

FILE=foo.tif
i=65;END=80;STEP=1
while [ $i -le $END ]; do
convert $FILE -threshold ${i}\% ${i}.png &
i=$((i+$STEP))
done

如果外壳部分将保持 POSIX 兼容。编辑:我在后台启动子进程来利用我获得的核心。

答案1

最简单的这样做的方法是GNU 并行,这或多或少会产生与脚本完全相同的操作序列(在进程和并行性方面),但更加简洁。

那么,从这张图片开始:

在此输入图像描述

你可以运行:

parallel magick image.jpg -threshold {}% {}.jpg ::: {65..80}

如果我对序列进行动画处理,您将得到以下结果:

在此输入图像描述


如果您只想加载一次图像并执行多次操作,那么您确实需要一个 magick 脚本。所以你可以生成这样的一个:

for ((t=65;t<=80;t++)) ; do
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done

这将生成一个像这样的脚本:

( -clone 0 -threshold 65% -write 65.jpg +delete )
( -clone 0 -threshold 66% -write 66.jpg +delete )
( -clone 0 -threshold 67% -write 67.jpg +delete )
( -clone 0 -threshold 68% -write 68.jpg +delete )
( -clone 0 -threshold 69% -write 69.jpg +delete )
( -clone 0 -threshold 70% -write 70.jpg +delete )
( -clone 0 -threshold 71% -write 71.jpg +delete )
( -clone 0 -threshold 72% -write 72.jpg +delete )
( -clone 0 -threshold 73% -write 73.jpg +delete )
( -clone 0 -threshold 74% -write 74.jpg +delete )
( -clone 0 -threshold 75% -write 75.jpg +delete )
( -clone 0 -threshold 76% -write 76.jpg +delete )
( -clone 0 -threshold 77% -write 77.jpg +delete )
( -clone 0 -threshold 78% -write 78.jpg +delete )
( -clone 0 -threshold 79% -write 79.jpg +delete )
( -clone 0 -threshold 80% -write 80.jpg +delete )

因此,如果您将其写入名为 的文件script.mgk,则可以像这样运行它:

magick image.jpg -script script.mgk

并多次重复使用该脚本。


或者,你可以生成它“即时”(无需创建临时文件)并将其通过管道传输到图像魔术师像这样:

for ((t=65;t<=80;t++)) ; do 
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done | magick image.jpg -script -

这会生成与上面相同的结果,但符合 POSIX 标准,希望您可以看到它只启动一个实例图像魔术师,并且仅加载输入图像一次,然后重新使用它。

相关内容