Reputation: 2214
I'm trying to batch resize a whole lot of image files using ImageMagick. I've created a Windows batch file which takes a single command line argument (including wildcards). The script should execute convert.exe (I renamed to imconvert.exe) for each image specified.
@echo off
setlocal EnableDelayedExpansion
set filename=%1
set file_part=%~nx1
set folder_part=%~dp1
if "%filename%" == "" (goto usage)
REM Create a new folder to put the resized ones in if it doesn't already exist
set newdir=%folder_part%resized\
echo %newdir%
if not exist %newdir% mkdir %newdir%
echo.
echo.
REM Now convert the files to 640 x 480
for /f %%f in (%filename%) do (
echo f
set image_file_name=%%~nxf
set path_and_filename=%newdir%%image_file_name%
echo %image_file_name%
echo %path_and_filename%
echo imconvert %%f -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite %path_and_filename%
echo.
)
echo.
echo Images written to %newdir%
echo.
goto end
:usage
echo.
echo Usage: imconvert_640x480 folder\filename*.jpg
echo.
:end
When I run this command:
C:>batchresize.bat d:\temp*.jpg
I get the following output:
d:\temp\79_DSC_0791.JPG resizedresizedresizedresizedDSC_0491.JPG d:\temp\resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\temp\79_DSC_0791.JPG -resize 640x480 -size 640x480 xc:black +swap - gravity center -composite d:\temp\resizedresizedresizedresizedresizedDSC_0491.JP G
d:\temp\DSC_0491.JPG resizedresizedresizedresizedDSC_0491.JPG d:\temp\resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\temp\DSC_0491.JPG -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite :\temp\resizedresizedresizedresizedresizedDSC_0491.JPG d:\temp\resizedDSC_0491.JPG
resizedresizedresizedresizedDSC_0491.JPG d:\temp\resizedresizedresizedresizedresizedDSC_0491.JPG imconvert d:\temp\resizedDSC_0491.JPG -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite d:\temp\resizedresizedresizedresizedresizedDSC_0491.JPG
Why am I getting "resizedresizedresizedresized" before the filename? Also why is the filename not updating on each iteration of the loop?
Upvotes: 1
Views: 34
Reputation: 49086
Here is your batch file rewritten to get it hopefully working:
@echo off
setlocal EnableDelayedExpansion
set "filename=%~1"
set "file_part=%~nx1"
set "folder_part=%~dp1"
if "%filename%" == "" goto usage
REM Create a new folder to put the resized ones in if it doesn't already exist
set "newdir=%folder_part%resized\"
echo %newdir%
if not exist "%newdir%" mkdir "%newdir%"
echo.
echo.
REM Now convert the files to 640 x 480
for %%I in ("%filename%") do (
echo %%I
set "image_file_name=%%~nxI"
set "path_and_filename=%newdir%!image_file_name!"
echo !image_file_name!
echo !path_and_filename!
echo imconvert.exe "%%~fI" -resize 640x480 -size 640x480 xc:black +swap -gravity center -composite "!path_and_filename!"
echo.
)
echo.
echo Images written to %newdir%
echo.
endlocal
goto :EOF
:usage
echo.
echo Usage: imconvert_640x480 folder\filename*.jpg
echo.
endlocal
Use double quotes everywhere around file names and paths to make it work also for files with 1 or more spaces in name or path.
Delayed expansion requires usage of !VariableName!
instead of %VariableName%
.
And parameter /F
is removed from command FOR as you want to process a simple file list.
For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
for /?
set /?
Upvotes: 2