尝试水平批量合并 2 .jpeg并将它们放在不同的文件夹中



这是我的医学博士论文。所以请原谅我在编程中的菜鸟。 我有一堆(大约 4000 个文件)来自患者的扫描。每位患者都有一个前.jpg和一个后。那里每天都有多个病人。 文件夹结构如下所示:

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

在第一个示例中,2017-08-21是患者进来的日期,pa_102165.jpg是正面,pa_10216500001.jpg是背面。所以前面总是pa_10XXXX.jpg的,后面是pa_10XXXX00001.jpg的.我没有参与命名方案。

我的目标是制作一个批处理脚本,将每个患者的 2 个相应的 .jpg 水平合并并自动将它们放入不同的文件夹中,这样我就不必使用 MS Paint 之类的东西手动完成。 例如像这样:

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

我正在开发 Windows 10,到目前为止发现了两种有前途的方法,但无法理解如何将其制作成批处理文件或类似的东西。

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

这比手动合并它们更快,但对所有货币对都需要多个工作日

和。。。

ImageMagic in Windows cmd
C:UsersmedoctorImagestestimages2016-03-31>convert pa_102165.jpg pa_10216500001.jpg +append pa_102165_merged.jpg

这将在输入图像所在的同一文件夹中生成合并的.jpeg。这看起来更有希望,但我无法掌握如何在给定命名方案和文件夹结构的情况下自动执行此过程。

感谢您抽出宝贵时间阅读本文!我为你的每一个意见感到高兴!

这应该让你相当接近。本质上,它是使用FOR命令修饰符的强大功能来提取基本文件名和文件扩展名。FOR /F命令正在捕获通过管道传输到FINDSTR命令的DIR命令的输出。 我们正在这样做,所以我们只抓取文件掩码为 pa_#####.jpg

一旦有了,我们将命令修饰符与IF命令一起使用,以确保00001文件存在。 如果它确实存在,那么它将执行转换命令。为了确保代码正确执行,我只是将输出ECHOING到屏幕上。 如果屏幕上的输出看起来正确,则删除ECHO以便执行CONVERT命令。

@echo off
CD /D "C:UsersmedoctorImagestestimages"
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"
)
)

可以使用IrfanView完成此任务,并将以下批处理文件存储在包含文件夹images的目录中。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "IrfanView=%ProgramFiles(x86)%IrfanViewi_view32.exe"
set "SourcePath=%~dp0images"
set "TargetPath=%~dp0merged"
for /F "delims=" %%I in ('%SystemRoot%System32where.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

必须在第三行中自定义IrfanView的完全限定文件名。还可以修改定义输出JPEG文件质量的选项/jpgq的百分比值。

命令WHERE在包含批处理文件的目录的子目录images中递归搜索与通配符模式匹配的文件,pa_10????.jpg忽略所有其他文件。找到的文件名以完整路径输出,此文件名列表由FOR捕获,并在WHERE完成后逐行处理。在这种情况下,WHERE由另一个在后台启动的cmd.exe执行,选项/c'中的命令行作为附加参数,而不是通过cmd.exe处理批处理文件。

阅读有关使用命令重定向运算符的Microsoft文档,了解2>nul的说明。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>必须使用插入符号^FOR 进行转义,才能在执行命令FOR之前将其解释为文字字符,该命令使用在后台启动的单独命令进程执行嵌入式where命令行。

每个具有全名(驱动器 + 路径 + 名称 + 扩展名)的图像文件一个接一个地分配给循环变量I。对于每个文件名,再使用一个FOR循环,该循环仅处理当前图像文件的完整路径,以将此路径与循环变量J附加一个点一起分配。末尾的点表示当前目录,即包含要处理的当前图像文件的目录。

如果该图像文件不存在匹配的pa_10????_merged.jpg文件,则接下来使用第一个IF条件进行检查,在这种情况下,当前图像文件无需执行任何操作。这意味着批处理文件可以根据需要在同一文件夹上执行,因为它仅针对尚不存在相应目标 JPEG 文件的源 JPEG 文件运行IrfanView

第二个IF条件检查后置图像是否也存在于当前正面图像的目录中,否则根本无法合并任何内容。

如果目标目录已经存在,则接下来使用第三个IF条件进行检查,如果不是这种情况,则创建此目录。

最后一个IF条件再次检查目标目录是否存在,如果现在按预期存在,则使用适当的选项调用IrfanView,以使用适当的文件名在目标目录中创建合并的图像文件。

IrfanView命令行上的右圆括号)必须使用^进行转义,以便由cmd.exe从字面上解释,以将此右括号传递给IrfanView,而不是将其解释为使用上述(打开的命令块之一的末尾。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,然后完整而仔细地阅读每个命令的显示帮助页面。

  • call /?......解释%~dp0...参数 0 的驱动器和路径,这是始终以反斜杠结尾的批处理文件路径
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • md /?
  • setlocal /?
  • where /?

双击 IrfanView的程序文件文件夹中i_options.txt的文本文件,以获取批处理文件中使用的IrfanView选项的说明。

最新更新