如何使用 for 命令存储 jpg 图像尺寸,将结果存储在 var 中,并在 imagemagick 命令行中使用 var

how to store jpg image dimensions using for command, store the results in a var, and use the var in an imagemagick command line

我正在尝试使用批处理脚本和 for 循环命令来查找工作目录中的所有 jpg 文件,然后使用第二个 for 命令循环来提取每个 jpg 图像的图像尺寸 'wxh' 值找到并将结果暂时存储在变量 fsize 中,以便稍后在脚本中使用...当 运行ning imagemagick 命令行时。

然后我将 运行 ImageMagick 使用以下命令行优化所有 jpg 文件,该命令行需要先前存储在 fsize 变量中的 wxh。由于可能有多个 jpg 文件要操作,我需要一次循环一个命令,直到最后一张图像被 imagemagick 处理。

我不知道如何让循环继续下去。

我能够获取每个 jpg 文件大小 wxh 并将其存储在 fsize var 中但是当所有图像完成后 运行ning jpg 文件的图像尺寸不匹配原始文件.....这一定是脚本中的错误,我正在努力寻找问题所在。

这就是我卡住的地方....有人看到我遗漏了什么吗?

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R %%G IN (*.jpg) DO (
    SET fpath=%%~fG
    SET fname=%%~nG
FOR /F "TOKENS=3" %%I IN ('MAGICK identify "!fpath!"') DO (
    SET fsize=%%I

IF "!fname!.jpg"=="!fname:*.png=!" (
    CALL :RunMagick fpath fname fsize

GOTO END

:RunMagick
ECHO MOGRIFY -monitor -path "output/!fname!" -filter Triangle -define filter:support=2 -thumbnail !fsize! -unsharp 0.25x0.08+8.3+0.045 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB -format jpg "!fname!"
    )
)
EXIT /B

    IF "%ERRORLEVEL%"=="0" GOTO :END
        ECHO.
        ECHO ERROR LINE 12: && ECHO.
        ECHO CHECK SCRIPT FOR ERRORS
        PAUSE >NUL
        EXIT

:END
ECHO.
ECHO END OF SCRIPT REACHED.
PAUSE>NUL
EXIT

使用 ImageMagick v7,您可以获得图像的尺寸并将它们直接应用于同一命令中的任何操作。除了其他人提到的一些命令构造问题外,我建议删除用于获取尺寸的“magick identify”部分,而是将其放在 IM 命令中...

... -thumbnail %[w]x%[h] ...

这只是将图像尺寸替换为“%[w]x%[h]”。

注意:宽度、高度等的转义替换“%[w]”可能不适用于“mogrify”。如果您在命令中的那个时间点一次只处理一张图像,您应该能够使用“magick !IMG! ...”获得完全相同的结果,而不使用“mogrify”。

所以我花了更多时间在这上面,因为 mogrify 无法使用已接受的答案。它在批处理脚本中也不能很好地工作。

我找到了一种使用标记获取 -thumbnail 选项的图像尺寸的方法。

这将使用 FOR 命令查找脚本文件夹中的每个 jpg 图像,然后它将使用命令 MAGICK identify 将信息输出到标准输出,脚本将使用第二个 FOR 命令和第三个标记捕捉图像尺寸。维度存储在变量 fsize.

因此,当使用 mogrify 处理每个图像时,它现在会自动插入原始图像的尺寸。

@ECHO OFF
SETLOCAL
COLOR 0A
TITLE MOGRIFY JPG FILES FOR OPTIMAL QUALITY

PUSHD "%~dp0"

IF NOT EXIST "output" MKDIR "output"

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%G IN (*.jpg) DO (
    SET "fname=%%G"
FOR /F "TOKENS=3" %%I IN ('MAGICK identify "!fname!"') DO (
    SET "fsize=%%I"
    CALL :RunMagick fname fsize
    :RunMagick
    MOGRIFY -monitor -path output/ -filter Triangle -define filter:support=2 -thumbnail "!fsize!" -unsharp 0.25x0.08+8.3+0.045 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB -format jpg "*.jpg"
    )
)
EXIT /B

:END
ECHO.
ECHO SCRIPT COMPLETE
PAUSE>NUL
EXIT