我有一百张图片,我想每次取 5 张的平均值。
前5个imagemagick命令是:
convert -background transparent %d.jpg[1-5] -average output1.jpg
第二个 5 的 imagemagick 命令是:
convert -background transparent %d.jpg[2-6] -average output2.jpg
第三个5的imagemagick命令是:
convert -background transparent %d.jpg[3-7] -average output3.jpg
我如何在 Windows 中以编程方式执行此操作?换句话说,我可以编写一个批处理文件来运行 imagemagick 以循环执行此操作吗?或者有更好的语言/方法/替代方案吗?
答案1
使用如下的批处理文件可以很容易地完成此操作:
@echo off
setlocal enabledelayedexpansion
for /l %%f in (1,1,5) do (
set /a cnt=%%f+4
REM If the output looks ok, remove the "echo" from the following line to actually run convert
echo convert -background transparent %%d.jpg[%%f-!cnt!] -average output%%f.jpg
)
endlocal
以下是带有“echo”的输出:
convert -background transparent %d.jpg[1-5] -average output1.jpg
convert -background transparent %d.jpg[2-6] -average output2.jpg
convert -background transparent %d.jpg[3-7] -average output3.jpg
convert -background transparent %d.jpg[4-8] -average output4.jpg
convert -background transparent %d.jpg[5-9] -average output5.jpg
提示:一定要指定 imagemagick 的 convert.exe 的完整路径,否则 Windows 自己的转变命令(将 FAT 卷转换为 NTFS)可能会默认运行。
答案2
下面是我拼凑的代码,可作为用于处理数千幅图像的 Windows 批处理文件:
- rem 我们将合并 5 张图片
- 设置/a U=0
- 设置/a V=1
- 设置/a W=2
- 设置/a X=3
- 设置/a Y=4
- rem 我们只会查看前 15 张图片
- 设置/a 终止符=15
- :环形
- 设置/a W= %W% + 1
- 设置/a V= %V% + 1
- 设置/a U= %U% + 1
- 设置/a X=%X% + 1
- 设置/a Y= %Y% + 1
- 如果 %Y%==%terminator% 则关闭
- 转到打开
- :关闭
- 暂停
- 出口
- :打开
- 转换 %%d.jpg[%U%-%Y%] -average -auto-level %U%out.jpg
- 转到循环
使用循环时,有些事情比较奇怪for next
,需要记住设置延迟局部表达式,并!
在变量名周围使用感叹号 ( ) 字符而不是百分号。在我回到这里并看到您已经解决了我的问题之前,我已经独立学习了这一点。使用循环的简单 goto 更透明,尽管 for 语句更优雅。