使用ImageMagick批量拆分JPEG

3
我使用以下命令来裁剪和分割名为page000.jpg的文件夹中的jpg文件,产生两个文件。
convert page000.jpg -crop 2x1@ +repage -colorspace gray ^
        +dither -colors 4 page000_%d.jpg

两个部分将被命名为page000_0.jpg和page000_1.jpg。
它运行良好,但我希望重写此代码以处理目录中的每个JPEG。
我为DOS (.bat)编写了这个批处理代码。
mkdir split
FOR %%f IN (*.jpg) DO xcopy %%f split\
cd split
FOR %%f IN (*.jpg) DO convert %%f -crop 2x1@ +repage -colorspace gray ^
                              +dither -colors 4 %%f_%d.jpg

然而,它无法正常工作。

1
你应该更准确地描述“无法工作”的具体情况。如果没有更多细节,你的问题很可能会被投票降低甚至关闭和删除。 - Kurt Pfeifle
谢谢,我会纠正这个。 - menteith
2个回答

2

您需要转义百分号,这些百分号不应该由批处理解析器解释,而是应该由转换解析器解释。

set "parameters=-crop 2x1@ +repage -colorspace gray +dither -colors 4"
FOR %%f IN (*.jpg) DO convert "%%f" %parameters% "%%~nf_%%d.jpg"
                                                        ^^ the escaped percent sign

但是,由于for命令不使用静态文件列表(列表在for命令迭代时检索),因此在该过程中生成的文件也可以进行处理。为了解决这个问题,您可以:
1 - 使用静态列表将for命令更改为for /f命令,首先使用dir命令检索文件列表。
for /f "delims=" %%f in ('dir /b /a-d *.jpg') do .....

2 - 处理原始目录中的输入文件,并将输出放置在 split 目录中。这样,由于生成的文件未放置在正在处理的同一文件夹中,因此不会被检测到。

mkdir split
set "parameters=-crop 2x1@ +repage -colorspace gray +dither -colors 4"
FOR %%f IN (*.jpg) DO convert "%%f" %parameters% "split\%%~nf_%%d.jpg"

它可以工作,但我得到的是00314.jpg_0.jpg而不是00314_0.jpg。 - menteith
@menteith,请查看更新后的答案。我忘记包括 %~nf,也就是正在处理的文件的名称(不带扩展名)。 - MC ND
就是这样,运行得非常完美。 - menteith

0

您不需要将文件复制到split子目录中,您可以让convert从它们所在的位置读取:

for %f in (*.jpg) do convert %f -crop 2x1@ +repage -colorspace gray +dither -colors 4 split/%~nf_%d.jpg

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