使用 ImageMagick 批量拆分 JPEG

Batch split JPEG using ImageMagick

我使用以下命令在生成两个文件的文件夹中裁剪和拆分 jpg 名称 page000.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

然而,它无法工作。

您需要转义需要由转换解析器而非批处理解析器解释的百分号。

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"

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

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