尝试使用Imagemagick的Mogrify批量调整JPG大小,同时保留/克隆原始目录

时间:2018-04-19 17:43:53

标签: batch-file imagemagick image-resizing mogrify

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

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_test\2018-04-19\133_PANA\P12345.JPG会调整大小并放在J:\Resized_test\2018-04-19\133_PANA\P12345.JPG

我该怎么做?

3 个答案:

答案 0 :(得分: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"
        )
    )
)

答案 1 :(得分: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数字,而不是每次都将它写入新行。

答案 2 :(得分: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"