我的具体目标是将 PNG 转换为例如一次调用 ImageMagick (v7) 命令行界面即可获得具有多种品质的 AVIF。为什么不多次调用?效率。这个想法是告诉 ImageMagick 它只需要加载输入文件一次,将其保留在内存中,同时输出具有不同质量设置的多个文件。
此脚本显示了我正在尝试执行的操作,但最后一个命令的语法不正确:
#!/bin/zsh
if [ $# -eq 0 ]; then
echo "Input file required (.png)"
exit 1
fi
infile=$1
basename="${infile%.*}"
mkdir -p avif
magick convert "$infile" \
-quality 50 "avif/$basename-50.avif" \
-quality 60 "avif/$basename-60.avif" \
-quality 70 "avif/$basename-70.avif"
我 (a) 搜索了 IM CLI 文档 并 (b) 向各种 AI 工具寻求帮助。到目前为止,还没有运气。
通过隔离括号内的写入操作,ImagcMagick 可以通过单个命令写入输入图像的多个版本。这是解决此问题的一种方法的示例......
infile=$1
basename="${infile%.*}"
mkdir -p avif
magick convert "$infile" \
\( -clone 0 -quality 50 -write "avif/$basename-50.avif" \) \
\( -clone 0 -quality 60 -write "avif/$basename-60.avif" \) \
\( -clone 0 -quality 70 -write "avif/$basename-70.avif" \) \
null:
该命令读取输入图像,将其克隆到括号内,设置质量,并写入输出,然后继续执行该命令。可以对其他克隆执行相同甚至不同的操作并将其写入磁盘。我在命令末尾使用了“null:”,因为 ImageMagick 期望命令以输出文件名结尾,并且我们的输出已经写入。
可以对每个子命令使用括号处理,并使用 +write XXX 保存结果和 MPR: 代替 -clone 来节省内存。同样对于 Imagemagick 7,请使用 magick,而不是 magick Convert。
#!/bin/zsh
if [ $# -eq 0 ]; then
echo "Input file required (.png)"
exit 1
fi
infile=$1
basename="${infile%.*}"
mkdir -p avif
magick "$infile" +write MPR:img +delete \
\( MPR:img -quality 50 +write "avif/$basename-50.avif" +delete \) \
\( MPR:img -quality 60 +write "avif/$basename-60.avif" +delete \) \
MRP:img -quality 70 "avif/$basename-70.avif"