在Windows上批量处理ImageMagick缩略图

3

我正在使用ImageMagick创建照片的缩略图。

我正在使用Windows操作系统。

我的源文件包含在许多子文件夹中。

我希望通过保存到不同驱动器上的目标文件夹来制作源文件的缩略图,同时保留相同的文件夹结构并修改原始文件名。

目标文件名与源文件相同,但修改了1个字符:

源文件示例:

c:\images\1\1L0000021.jpg
c:\images\1\1L000561.jpg
c:\images\2\234L0000032.jpg
c:\images\3\31214L000001.jpg

到目标驱动器:
d:\images\1\1M0000021.jpg
d:\images\1\1M000561.jpg
d:\images\2\234M0000032.jpg
d:\images\3\31214M000001.jpg

注意:只需要将 L 改为 M 即可

源文件名格式始终是:*m*.jpg

这是我想要运行的图像处理命令:

convert -thumbnail 200x220^^ -gravity center -extent 200x200 -quality 80 c:\images\*.jpeg d:\images\output.jpeg

上述命令会从源文件夹创建所需的缩略图并保存到目标文件夹,但输出文件名不正确且不遍历子文件夹。
问题:
1)如何遍历每个文件夹和子文件夹,然后输出到目标驱动器上的确切相同的结构(如果不存在,则创建文件夹)?
2)如何修改输出文件名,使*l*.jpeg变为*m*.jpeg

你猜测地调用了批处理文件convert.bat。这是我们在某个阶段都会陷入的陷阱,使用现有命令作为名称。 - foxidrive
你是正确的 - 哦!感谢你的帮助,现在一切都正常工作了! - George Filippakos
3个回答

3

更新

以下是我的最终代码,希望对未来的任何人有所帮助:

::You must first install ImageMagick

::This job converts large photos into 200x200 thumbnails and saves the new files to the specified destination.

@echo off 
setlocal enabledelayedexpansion

SET "@SOURCE=C:\Test\photos\"
SET "@DEST=C:\dest"

REM Replicate source folder structure to destination:

for /r %@SOURCE% %%D in (.) do (

    echo Creating folder: %@DEST%%%~pnxD
    @md "%@DEST%%%~pnxD"

)


REM Select images from source using wildcard:

for /r %@SOURCE% %%F in (*l*.jpeg) do (

    REM Modify file name (i'm replacing 'l' for 'm')  

    set "fname=%%~nF"
    set "fname=!fname:l=m!"


    REM Convert source image to thumbnail and save to destination:

    REM echo Source: %%F
    echo Saving: %@DEST%%%~pnxF

    @convert -thumbnail 200x220^^^^ -gravity center -extent 200x200 -quality 80 "%%F" "%@DEST%%%~pF!fname!%%~xF"

)

2

1)这是如何将C:\source文件夹树复制到X:\dest的方法:

for /r C:\source %I in (.) do @md "X:\dest%~pnxI"

这个for循环的作用是遍历一个文件夹树,从C:\source开始,每个文件夹的名称保存在变量%I中。命令“md”是“mkdir”的简写。修饰符“~pnx”去掉原始驱动器号,以便可以添加X:\dest。 注意,“X:\dest”后面没有反斜杠,因为原始路径的第一个反斜杠被保留。
2)使用相同的命令运行Imagick命令来处理JPEG文件:
for /r C:\source %I in (.) do @convert -options %I "X:\dest%~pnxI"

目标名称相同。 3)使用Naru的FlexibleRenamer工具(http://hp.vector.co.jp/authors/VA014830/english/FlexRena/),重命名目标文件夹中所有JPEG文件。它可以使用正则表达式来选择和修改名称。 你可以重命名。
"(\d+)L(.+)"

to

"\1M\2"

意思是:至少包含一个小数点,接着是字面值“L”,再接着至少包含一个字符。名称将被替换为第一部分,一个字面值“M”和第二部分。

编辑: 处理步骤2)需要文件选择器才能工作,如下所示:

for /r C:\source %I in (*.jpg) do @convert -options %I "X:\dest%~pnxI"

否则,仅处理文件夹名称 - 这取决于“转换”程序是否足够。

我收到了“~pnxI在这个时间是意外的”错误信息。 - George Filippakos
请忽略,我需要在批处理文件中添加双%%。 - George Filippakos
是的,抱歉,这是直接从命令行输入的。在批处理中,请使用双百分号代替单个百分号。 - user1016274
我已尝试实现您的代码,但批处理文件在尝试运行转换时变得混乱并不断崩溃(请参见更新的答案)。 - George Filippakos

2

试试这个:

@echo off &setlocal enabledelayedexpansion
for /r "c:\images" %%a in (*.jpg) do (
    set "fname=%%~na"
    set "fname=!fname:L=M!"
    md "D:%%~pa" 2>nul
    convert -thumbnail 200x220^^ -gravity center -extent 200x200 -quality 80 "%%~fa" "D:%%~da!fname!%%~xa"
)

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