尝试使用 Imagemagick Mogrify 批量调整 JPEG 的大小,同时 retaining/cloning 个原始目录

Trying to use Imagemagick's Mogrify to batch resize JPGs while retaining/cloning original directories

我正在尝试为大量照片创建一个调整大小的副本,同时保留它们来自的目录结构。这是我目前所拥有的:

cd /d J:\Photos_test
for /r /d %%a in (*) do magick mogrify -path "J:\Resized_test" -resize 1920x1080^> "%%~a\*.jpg"

这会获取在 J:\Photos_test 的子目录中找到的所有 JPG,并在 J:\Resized_test 中创建一个调整大小的副本。

我想做的是在执行调整大小操作时重新创建源目录。因此,J:\Photos_test18-04-193_PANA\P12345.JPG 将调整大小并放置在 J:\Resized_test18-04-193_PANA\P12345.JPG

我该怎么做?

我无法测试您代码的 Imagemagick 部分,因为我无法在我的工作电脑上加载它。

基本上我所做的是在尝试对该目录进行任何进一步处理之前添加一个检查以查看该目录中是否存在 JPG 文件。如果目录中有 JPG 文件,它会从文件路径中删除第一个目录。如果该目录不存在,它将创建该目录。最后它执行您的 ImageMagick 命令。

@echo off
cd /d J:\Photos_test
REM get listing of folders
for /r /d %%G in (*) do (
    REM Check if there are jpg files in the folder
    IF EXIST "%%~G\*.jpg" (
        REM strip off the first directory from the input folder path and process the file
        REM The FOR variable %%I becomes the relative path. Folder Path minus the first directory.
        for /F "tokens=1* delims=\" %%H in ("%%~pG") do (
            REM If the folder does not exist create it.
            IF NOT EXIST "J:\Resized_test\%%I\" MD "J:\Resized_test\%%I\"
            magick mogrify -path "J:\Resized_test\%%I" -resize "1920x1080>" "%%~G\*.jpg"
        )
    )
)

好的,所以我让我哥帮我解决一下。这是他想出的:

@echo off
setlocal EnableDelayedExpansion
title Batch JPEG Resizer

:: SOURCE FOLDER GOES HERE (NO FINAL \)
set "jpg_source=J:\Photos"

:: DESTINATION FOLDER GOES HERE (NO FINAL \)
set "jpg_destination=J:\Resized"

:: IMAGE RESOLUTION TO CONVERT TO (UNLESS SOURCE RESOLUTION IS SMALLER)
set "image_resolution=1920x1080"

cd /d %jpg_source%
set "relative_path=%cd:~2%"
for /f %%l in ('Powershell $Env:relative_path.Length') do (set relative_path_len=%%l)
for /r %%b in (*.jpg *.jpeg) do (set /a "jpg_count+=1" & echo !jpg_count!)
pause

for /r %%a in (*.jpg *.jpeg) do (
    set /a "current_jpg_number+=1"
    set "current_relative_path=%%~pa"
    set "current_relative_path=!current_relative_path:~%relative_path_len%!"
    if not exist "%jpg_destination%!current_relative_path!" mkdir "%jpg_destination%!current_relative_path!"
    if not exist "%jpg_destination%!current_relative_path!%%~na%%~xa" magick convert "%%a" -resize %image_resolution%^> "%jpg_destination%!current_relative_path!%%~na%%~xa"
    echo Image !current_jpg_number! of !jpg_count!: %%a
)

pause

这似乎可以解决问题!他添加了变量以方便将来修改,还包括一个计数器和状态读数。我想要的最后一件事是让计数器简单地替换和更新回显的 jpg_count 数字,而不是每次都将其写入新行。

最小解:

copy.bat on the origin folder:

XCOPY /S/D *.jpg  S:\icons\ 

XCOPY /S/D *.jpeg S:\icons\ 

resize.bat 在目标文件夹上:

FOR /R %%a IN (*.jpg) DO magick convert "%%~a" -resize 600x200 "%%~a"