ImageMagick 命令:将图像转换并以相同名称保存

34

我正在使用ImageMagick的convert命令在PHP中制作缩略图并将转换后的图像保存到另一个目录中,逐个进行。

但是,我无法弄清楚如何在转换后的图像中保留原始文件名。

> convert 1.JPG -resize 120X120 thumb/*.JPG

需要保持输出文件名与输入文件名相同。 请帮忙。

5个回答

41
另一种方法:
convert *.jpg -resize 80% -set filename:f '%t' ../'%[filename:f].jpg'

将转换后的文件放置在上面的文件夹中。
选项-set filename:f '%t'将属性filename:f设置为不带扩展名的当前文件名。以filename:开头的属性是一种特殊情况,可以在输出文件名中引用。在这里,我们将其设置为../'%[filename:f].jpg,这实际上是父目录中的图像文件名,扩展名被替换为.jpg
文档参考:

由于某些原因,当输出为.webp时,这对我不起作用。 - Flimm
这确实应该可以工作,但在我的情况下也不起作用(Windows 11,WebP);它只会创建一个大文件。 - svenema
这确实应该可以工作,但在我的情况下也不起作用(Windows 11,WebP);它只会创建一个大文件。 - undefined

35

一个简单的解决方案是先复制,然后使用另一个 imagemagick 工具 mogrify 进行转换 - 这样可以保持相同的名称,并且它接收与 convert 相同的所有参数。

cp *.jpg thumb/
cd thumb
mogrify -resize 120X120 *.JPG

或者您可以编写一些shell脚本,使用find -exec或xargs命令

# using -exec
find . -iname "*.JPG" -maxdepth 1 -exec convert -resize 120x120 {} thumbs/{} \;

# using xargs
find . -iname "*.JPG" -maxdepth 1 | xargs -i{} convert -resize 120x120 {} thumbs/{}

谢谢,伙计。它起作用了。我也会查看exec和xargs的。 再次感谢。 - Avisek Chakraborty

7

另一种不需要大量输入的简单方法是GNU Parallel

parallel convert {} -resize 120X120 thumb/{} ::: *.jpg

对于每个在:::后给定的文件,都会调用convert函数,并且{}将在每次调用时被相应的文件名替换。这也会并行处理这些文件,因此比其他解决方案要快得多。

如果您想转换文件类型,它也可以正常工作:

parallel convert {} {.}.png ::: *.jpg

{.}会被替换为没有扩展名的文件名,这使得您可以轻松更改它。


2

我的工作内容如下:

将所有文件转换为文件名-new.扩展名

for FILE in *; do convert -resize 320 $FILE $(echo $FILE | sed 's/\./-new./'); done

将所有的filename-new.extension文件移回到filename.extension中:
for FILE in *; do mv $FILE $(echo $FILE | sed 's/-new//'); done

0
在Windows中,請這樣做:
FOR /f "tokens=*" %G IN ('dir /b *.jpg') DO convert %G -resize 120x120 thumb\%G

注意:

  • 请确保提前创建thumb文件夹。
  • 如果您将其作为批处理(.bat)文件的一部分,请使用%%代替%
  • 与一次性使用一个convert完成所有操作相比,这样做更节省内存,可能的话..

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接