如何在终端中批量/多处理裁剪图像?

Joe*_*ola 2 command-line imagemagick image-processing batch

我试图裁剪几张相同大小的图像,但是当我裁剪 5 张图像并且过程完成时,只裁剪了 4 张图像,没有裁剪 1 张图像,如果我裁剪 1 张图像,则会出现错误...

我正在使用命令

convert -crop 599x500+147+200 *.jpg
Run Code Online (Sandbox Code Playgroud)

屏幕截图批量裁剪 5 张图片但仅处理 4 张图片

屏幕截图批量裁剪 1 张图片但出现错误

我应该如何调整我的命令?

Zan*_*nna 5

第一个问题似乎发生了,因为当convert接收到一个列表时,它将使用指定为输出文件名的最后一个文件。所有新文件都以最后一个文件命名,该文件本身保持不变(这不太可能是您想要或期望的,但这可能比您的文件被意外覆盖要好)。

当目录中只有一个文件时(因此您的 glob 扩展为一个文件),会convert抱怨缺少定义的图像,因为它需要至少指定一个输入文件和一个输出文件名。您用于 glob 的位置是输出文件名位置,因此convert抱怨第二张图像中缺少输入文件。

为了获得更可靠的结果,您应该指定输入和输出文件:

 convert input-file.jpg -crop 599x500+147+200 new-file.jpg
Run Code Online (Sandbox Code Playgroud)

如果名称很长,您应该能够对输入文件和输出文件使用制表符补全(键入前几个字符,然后按制表符让 shell 完成名称)(也就是说,它对我来说工作正常)。

对于批处理,您可以使用 shell 对每个文件运行一次命令,并使用一些字符串操作来构造新名称,因此新文件具有合理的名称,例如:

 convert input-file.jpg -crop 599x500+147+200 new-file.jpg
Run Code Online (Sandbox Code Playgroud)

echo第二行中,这显示了新名称的含义。如果新名称看起来正确,您可以删除echo并再次运行命令以实际裁剪图像。

将新文件放入新目录可能更容易,特别是如果您的文件名具有不同的扩展名...

for f in *.jpg; do 
    echo convert "$f" -crop 599x500+147+200 "${f/.jpg/-cropped.jpg}"
done
Run Code Online (Sandbox Code Playgroud)

同样,您需要先删除,echo然后才能执行任何操作。