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

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

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

我正在使用命令

convert -crop 599x500+147+200 *.jpg

截图批量裁剪5张图片但只处理4张图片

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

我该如何调整我的指挥?

答案1

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

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

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

 convert input-file.jpg -crop 599x500+147+200 new-file.jpg

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

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

for f in *.jpg; do 
    echo convert "$f" -crop 599x500+147+200 "${f/.jpg/-cropped.jpg}"
done

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

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

mkdir cropped
for f in *.jpg *.png; do
    echo convert "$f" -crop 599x500+147+200 cropped/"$f" 
done

再次强调,您需要先将其删除,echo然后才能执行任何操作。

相关内容