代码之家  ›  专栏  ›  技术社区  ›  JamesA

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

  •  0
  • JamesA  · 技术社区  · 6 年前

    我正在尝试创建大量照片的大小调整副本,同时保留它们来自的目录结构。以下是我目前掌握的情况:

    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

    我该怎么做?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Squashman Stephan    6 年前

    我无法测试代码的Imagemagick部分,因为我无法将其加载到我的工作pc上。

    基本上,我所做的是在尝试对该目录进行任何进一步处理之前,添加一个检查以查看该目录中是否存在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"
            )
        )
    )
    
        2
  •  0
  •   JamesA    6 年前

    好的,所以我让我弟弟帮了我一点忙。这就是他想到的:

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

        3
  •  0
  •   Lew Winczynski José Oliveira    3 年前

    最小解决方案:

    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" 
    
    推荐文章