Home > database >  Trying to batch merge 2 .jpeg's horizontally and put them in a different folder after
Trying to batch merge 2 .jpeg's horizontally and put them in a different folder after

Time:11-27

this is for my doctoral thesis in medicine. So please excuse my noobishnis in programing. I have a bunch (about 4000 files) of scans from patients. There is a front and a back .jpg for each patient. And there where multiple patients each day. The folder structure looks like this:

\images
    \2017-08-21
              \pa_102165.jpg
              \pa_10216500001.jpg
    \2017-06-14
              \pa_101545.jpg
              \pa_10154500001.jpg
              \pa_104761.jpg
              \pa_10476100001.jpg
              \pa_107514.jpg
              \pa_10751400001.jpg
    \2017-03-73
              \pa_109631.jpg
              \pa_10963100001.jpg
              \pa_108624.jpg
              \pa_10862400001.jpg

Where in the first example 2017-08-21 is the date the patient came in, pa_102165.jpg is the front and pa_10216500001.jpg is the back. So the front is always pa_10XXXX.jpg and the back is pa_10XXXX00001.jpg. I had no hand in the nameing scheme.

My goal is to make a batchscript that merges the 2 corresponding .jpgs of each patient horizontally and automatically puts them in a different folder, so that I don't have to do it manually with something like MS Paint. For example like this:

\images
\merged
        \2017-08-21
                      \pa_102165_merged.jpg
        \2017-06-14
                      \pa_101545_merged.jpg
                      \pa_104761_merged.jpg
                      \pa_107514_merged.jpg
        \2017-03-73
                      \pa_109631_merged.jpg
                      \pa_108624_merged.jpg

I'm working on Windows 10 and found two promising methods so far but fail to comprehend how to make this into a batch file or something like it.

IrfanView Thumbnails
    1. Mark the 2 corresponding .jpgs
    2. File>Create contact sheet from selected files...
    3. Create
    4. File>Save as... in destination folder which i have to create for every day

which is faster than merging them by hand but would consume multiple workdays to do for all the pairs

and...

ImageMagic in Windows cmd
        C:\Users\me\doctor\Images\test\images\2016-03-31>convert pa_102165.jpg pa_10216500001.jpg  append pa_102165_merged.jpg

This produces the merged .jpeg in the same folder the input images are in. This looks more promising but I fail to grasp how I could automate this process given the nameing scheme and the folder structure.

Thanks for taking the time to read this! I'm happy for every input you have!

CodePudding user response:

This should get you fairly close. Essentially it is using the power of the FOR command modifiers to extract the base file name and file extension. The FOR /F command is capturing the output of the DIR command that is piped to the FINDSTR command. We are doing that so we only grab files with the file mask of pa_######.jpg

Once we have that we use the command modifiers with the IF command to make sure the 00001 file exists. If it does exist then it will execute the convert command. For the sake of making sure the code is performing correctly I am just ECHOING the output to the screen. If the output on the screen looks correct then remove the ECHO so that the CONVERT command executes.

@echo off

CD /D "C:\Users\me\doctor\Images\test\images"

FOR /F "delims=" %%G IN ('DIR /A-D /B /S PA_*.jpg ^|findstr /RIC:"pa_[0-9][0-9][0-9][0-9][0-9][0-9]\.jpg$"') DO (
    IF EXIST "%%~dpnG00001%%~xG" (
        ECHO convert "%%G" "%%~dpnG00001%%~xG"  append "%%~dpnG_merged%%~xG"
    )
)

CodePudding user response:

This task could be done with IrfanView with the following batch file stored in the directory containing the folder images.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "IrfanView=%ProgramFiles(x86)%\IrfanView\i_view32.exe"
set "SourcePath=%~dp0images"
set "TargetPath=%~dp0merged"
for /F "delims=" %%I in ('%SystemRoot%\System32\where.exe /R "%SourcePath%" pa_10????.jpg  2^>nul') do for %%J in ("%%~dpI.") do (
    if not exist "%TargetPath%\%%~nxJ\%%~nI_merged%%~xI" if exist "%%~dpnI00001%%~xI" (
        if not exist "%TargetPath%\%%~nxJ\" md "%TargetPath%\%%~nxJ"
        if exist "%TargetPath%\%%~nxJ\" (
            echo Merging "%%~nxJ\%%~nxI" and "%%~nxJ\%%~nI00001%%~xI" ...
            "%IrfanView%" /convert="%TargetPath%\%%~nxJ\%%~nI_merged%%~xI" /jpgq=95 /panorama=(1,"%%I","%%~dpnI00001%%~xI"^)
        )
    )
)
endlocal

There must be customized the fully qualified file name of IrfanView in the third line. There can be modified also the percent value of option /jpgq which defines the quality of the output JPEG file.

The command WHERE searches recursive in subdirectory images of the directory containing the batch files for files matching the wildcard pattern pa_10????.jpg with ignoring all other files. The found file names are output with full path and this list of file names is captured by FOR and processed line by line after WHERE finished. WHERE is executed in this case by one more cmd.exe started in background with option /c and the command line within ' as additional arguments and not by cmd.exe processing the batch file.

Read the Microsoft documentation about Using command redirection operators for an explanation of 2>nul. The redirection operator > must be escaped with caret character ^ on FOR command line to be interpreted as literal character when Windows command interpreter processes this command line before executing command FOR which executes the embedded where command line in a separate command process started in background.

Each image file with full name is assigned one after the other to the loop variable I. For each file name one more FOR loop is used which processes just the full path to the current image file to assign this path without the trailing backslash to the loop variable J.

There is next checked with the first IF condition if for that image file does not exist already a matching pa_10????_merged.jpg file in which case there is nothing to do for the current image file. That means the batch file can be executed on same folder as often as wanted because of it runs IrfanView only for the source JPEG files for which the appropriate target JPEG file does not exist already.

The second IF condition checks if the back image exists also in the directory of current front image as otherwise nothing can be merged at all.

There is next checked with the third IF condition if the target directory exists already and this directory is created if that is not the case.

The last IF condition checks once again the existence of the target directory and if that exists now as expected, IrfanView is called with the appropriate options to create the merged image file in the target directory with the appropriate file name.

The closing round bracket ) on IrfanView command line must be escaped with ^ to be interpreted literally by cmd.exe to pass this closing parenthesis to IrfanView instead of interpreting it as end of one of the command blocks opened with ( above.

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.

  • call /? ... explains %~dp0 ... drive and path of argument 0 which is the batch file path always ending with a backslash
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • md /?
  • setlocal /?
  • where /?

Double click on text file i_options.txt in program files folder of IrfanView for the description of the IrfanView options as used in the batch file.

  • Related