我正在使用ImageMagick的convert命令在PHP中制作缩略图并将转换后的图像保存到另一个目录中,逐个进行。
但是,我无法弄清楚如何在转换后的图像中保留原始文件名。
> convert 1.JPG -resize 120X120 thumb/*.JPG
需要保持输出文件名与输入文件名相同。 请帮忙。
我正在使用ImageMagick的convert命令在PHP中制作缩略图并将转换后的图像保存到另一个目录中,逐个进行。
但是,我无法弄清楚如何在转换后的图像中保留原始文件名。
> convert 1.JPG -resize 120X120 thumb/*.JPG
需要保持输出文件名与输入文件名相同。 请帮忙。
convert *.jpg -resize 80% -set filename:f '%t' ../'%[filename:f].jpg'
-set filename:f '%t'
将属性filename:f
设置为不带扩展名的当前文件名。以filename:
开头的属性是一种特殊情况,可以在输出文件名中引用。在这里,我们将其设置为../'%[filename:f].jpg
,这实际上是父目录中的图像文件名,扩展名被替换为.jpg
。-set
文档,提到了 filename:
特殊情况%t
和其他格式和打印图像属性一个简单的解决方案是先复制,然后使用另一个 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/{}
另一种不需要大量输入的简单方法是GNU Parallel:
parallel convert {} -resize 120X120 thumb/{} ::: *.jpg
对于每个在:::
后给定的文件,都会调用convert
函数,并且{}
将在每次调用时被相应的文件名替换。这也会并行处理这些文件,因此比其他解决方案要快得多。
如果您想转换文件类型,它也可以正常工作:
parallel convert {} {.}.png ::: *.jpg
{.}
会被替换为没有扩展名的文件名,这使得您可以轻松更改它。
我的工作内容如下:
将所有文件转换为文件名-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
FOR /f "tokens=*" %G IN ('dir /b *.jpg') DO convert %G -resize 120x120 thumb\%G
注意:
thumb
文件夹。%%
代替%
。convert
完成所有操作相比,这样做更节省内存,可能的话..
.webp
时,这对我不起作用。 - Flimm