這是我的醫學博士論文。所以請原諒我在編程方面的noobishnis。我有一堆(大約 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:\Users\me\doctor\Images\test\images\2016-03-31>convert pa_102165.jpg pa_10216500001.jpg append pa_102165_merged.jpg
這會在輸入影像所在的同一檔案夾中生成合并的 .jpeg。這看起來更有希望,但我無法理解如何在給定命名方案和檔案夾結構的情況下自動執行此程序。
感謝您抽時間閱讀!我很高興你的每一個投入!
uj5u.com熱心網友回復:
這應該讓你相當接近。本質上,它使用FOR命令修飾符的強大功能來提取基本檔案名和檔案擴展名。該FOR /F命令正在捕獲通過DIR管道傳輸到該FINDSTR命令的命令的輸出。我們這樣做所以我們只抓取檔案掩碼為pa_######.jpg 的檔案
一旦我們有了它,我們就可以在命令中使用命令修飾符IF來確保00001檔案存在。如果它確實存在,那么它將執行轉換命令。為了確保代碼正確執行,我只是ECHOING螢屏的輸出。如果螢屏上的輸出看起來正確,則洗掉ECHO以便CONVERT執行命令。
@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"
)
)
uj5u.com熱心網友回復:
可以使用IrfanView完成此任務,并將以下批處理檔案存盤在包含檔案夾的目錄中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
第三行必須有自定義IrfanView的全限定檔案名。也可以修改/jpgq定義輸出 JPEG 檔案質量的選項的百分比值。
命令WHERE在images包含批處理檔案的目錄的子目錄中遞回搜索匹配通配符模式的檔案,pa_10????.jpg并忽略所有其他檔案。找到的檔案名以完整路徑輸出,此檔案名串列由FOR捕獲并在WHERE完成后逐行處理。在這種情況下,WHERE是通過cmd.exe在后臺啟動的另一個選項/c和命令列'作為附加引數而不是通過cmd.exe處理批處理檔案來執行的。
閱讀關于微軟的檔案使用命令重定向運算子的的解釋2>nul。當 Windows 命令解釋器在執行命令FOR之前處理此命令列時,重定向運算子>必須^在FOR命令列上用脫字符符轉義為文字字符,該命令在后臺啟動的單獨命令列程中執行嵌入的命令列。where
每個具有全名(驅動器 路徑 名稱 擴展名)的影像檔案一個接一個地分配給回圈變數I。對于每個檔案名,再使用一個FOR回圈,該回圈僅處理當前影像檔案的完整路徑,以分配此路徑,并在回圈變數后附加一個點J。末尾的點表示當前目錄,即包含當前要處理的影像檔案的目錄。
接下來檢查第一個IF條件,如果該影像檔案不存在已經匹配的pa_10????_merged.jpg檔案,在這種情況下,當前影像檔案無事可做。這意味著批處理檔案可以根據需要在同一檔案夾中執行,因為它僅針對不存在相應目標 JPEG 檔案的源 JPEG 檔案運行IrfanView。
第二個IF條件檢查背面影像是否也存在于當前正面影像的目錄中,否則根本無法合并任何內容。
如果目標目錄已經存在,則接下來使用第三個IF條件進行檢查,如果不存在,則創建該目錄。
最后一個IF條件再次檢查目標目錄是否存在,如果現在按預期存在,則呼叫IrfanView并使用適當的選項在目標目錄中創建具有適當檔案名的合并影像檔案。
閉合圓形托架)上的IrfanView命令列必須以轉義^要由字面解釋cmd.exe本右括號傳遞給IrfanView的而不是將其解釋為與打開命令塊中的一個的端部的(上方。
要了解使用的命令及其作業原理,請打開命令提示符視窗,在那里執行以下命令,并仔細閱讀為每個命令顯示的所有幫助頁面。
call /?... 解釋%~dp0... 引數 0 的驅動器和路徑,它是批處理檔案路徑,始終以反斜杠結尾echo /?endlocal /?for /?if /?md /?setlocal /?where /?
雙擊IrfanViewi_options.txt程式檔案檔案夾中的文本檔案,查看批處理檔案中使用的IrfanView選項的描述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367795.html
