0

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

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

这将获取在 的子目录中找到的任何 JPG,J:\Photos_test并在J:\Resized_test.

我想要做的是在进行调整大小操作时重新创建源目录。所以,J:\Photos_test\2018-04-19\133_PANA\P12345.JPG将被调整大小并放置在J:\Resized_test\2018-04-19\133_PANA\P12345.JPG

我怎样才能做到这一点?

4

3 回答 3

0

我无法测试代码的 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"
        )
    )
)
于 2018-04-19T20:00:29.190 回答
0

好的,所以我让我的兄弟帮助我。这是他想出的:

@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 数字,而不是每次都将其写入新行。

于 2018-04-23T21:39:37.590 回答
0

最小的解决方案:

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" 
于 2021-04-10T09:02:37.260 回答