ImageMagick 範例 --
在 Windows 下的使用
IM 範例中的大多數命令都是專門針對 LINUX 和 UNIX shell 腳本編寫的,因為這些系統在設計時就考慮到了批次處理和網路伺服器。然而,越來越多的 ImageMagick 使用者希望在 Windows 環境中使用它。本節將詳細介紹如何在該環境中使用 IM,以及更重要的是,如何將 UNIX shell 命令(如 IM 範例的其餘部分所示)轉換為其 Windows DOS 等效命令。我要特別感謝 Wolfgang Hugemann <ImageMagick_AT_Hugemann.de>,他完全重寫了原始筆記,並將其擴展到涵蓋更多主題,特別是 Windows 使用者關注的主題。您在這裡看到的是他的作品,IM 使用者應感謝他的時間和耐心。
此程式碼假設 IM 安裝在程式資料夾下名為「ImageMagick」的資料夾中,這**不是**其安裝資料夾的標準命名。(如需詳細資訊,請參閱在 Windows 下安裝 ImageMagick。)
為了簡單起見,我們不會在接下來的每個範例中都使用此程式碼,但您應該將此視為一個好習慣。如需此問題的良好替代摘要和解決方案,請參閱Ron Savage:MS Windows 和 convert.exe。
但這在 Windows 下不會建立所需的字串。但是,您可以從文字檔讀取 UTF-8 編碼的字串
您甚至可以使用「
但是,如果您要處理 DOS 命令的輸出,例如,當您嘗試使用特定目錄的名稱為該目錄中包含的 JPEG 建立索引列印標題時,您就會遇到麻煩。對於大多數 DOS 命令,切換到字碼頁 65001 是行不通的,尤其是在迴圈處理目錄樹時。而在例如 1252(西歐語系拉丁文)和 65001 之間來回切換字碼頁通常也行不通,或者至少會變得相當棘手。最安全的方法是在需要時使用外部命令列程式來轉換字串,例如「
這些參數告訴 Iconv 從 ISO-8859-1(字碼頁 1252)轉碼為 UTF-8。Iconv 將其輸出寫入 stdout,因此您必須將其重定向到一個檔案,才能將其用於「標籤」。請注意,無論如何,建議將輸出傾印到文字檔中,因為這會告訴 ImageMagick 按字面解釋檔案內容,而不會將 Windows 反斜線(「\」)視為轉義字元。當然,上述範例中的程式碼沒有太大意義,因為它在此處僅用於示範目的。在實際的 DOS 批次檔中,檔名可能會在 FOR 迴圈中產生。下面將提供一個實際範例(請參閱批次處理(子)目錄樹)。如需 UTF 處理的詳細資訊,請參閱其他 IM 範例以及Unicode 或 UTF8 格式文字處理中的資訊。
等同於
在管道的第一个命令中,减号运算符告诉 IM 将图像写入 stdout,而管道中第二个命令的减号运算符告诉 IM 从 stdin 读取图像。这种处理方式可以避免显式使用临时文件。如果某些命令不提供某些操作,例如裁剪,则此功能特别有用
由於此功能的緣故,文字輸出通常會寫入標準錯誤輸出 (stderr),而不是標準輸出 (stdout)。例如:如果您想將「比較」的文字輸出重定向到文字檔案,則必須寫入
所以您必須將 stderr(“2>”)重定向到文字文件,而不是 stdout(“1>” 或僅 “>”)。
當您啟動 Cygwin 時,它的 Bash shell 看起來很像 DOS 框,即一個黑色背景的文字視窗。如同 DOS 視窗,字型可以透過點擊標題列左側的視窗系統選單來選擇。基本命令如下:
將變為類似於 Windows DOS 批次檔...
我已經透過使用 SED(Streaming EDitor)編寫了一個基本的 Linux shell 到 DOS 批次檔轉換器。SED 是一種常見的 UNIX/Linux 文字檔操作程式,也可以在 Windows 上從 http://sed.sourceforge.net/ 取得。就像 IM 是一個命令驅動的影像處理器一樣,SED 是一個命令驅動的編輯器。執行所需操作的 SED 腳本
您可以下載帶完整註釋的版本檔案 sed_script.zip。如果您將 SED 腳本
您也可以透過使用以下批次檔,透過「傳送到」或拖放來呼叫轉換
此批次檔假設您已將 SED 腳本
由於
這將在同一個目錄中產生一個 JPEG 檔案(具有標準品質和解析度),並在後面加上一個「.jpg」副檔名。上述代碼適用於任何檔名,無論它是否包含空格。如果您想擺脫原始副檔名,事情就會變得有點棘手
上述批次檔透過使用
這些修飾符可以組合使用,因此「
這將只顯示字串操作的結果。
請注意,百分號沒有加倍。但是,如果您將此命令放在批次檔中,則必須將其替換為
同樣,透過拖放或「傳送到」來調用此批次操作很方便,將完整的檔名(或資料夾名稱)傳遞給可能位於另一個目錄(例如
在此批次檔中,我們
這可能會使事情變得更簡短一些,但也會更加棘手。請注意,檔案名稱修飾符號也適用於 For 迴圈變數
此批次檔將處理作為命令列參數傳遞的目錄中找到的所有影像。首先,它會模糊原始影像並將其反轉,將中間結果儲存在一個具有額外「
其中「
但是,使用單獨的批次檔提供了 DOS 批次檔的所有(有限)可能性。這在本例中沒有任何區別,但我們將在後面展示這種方法的好處。如果您不想處理兩個批次檔,可以使用腳本建立第二個
使用
當使用 "
第一行會清除先前搜尋的任何結果。在第二行,我們定義環境變數 COUNT,我們將使用它來產生
在第一行,我們將程式碼頁切換為西歐語系拉丁文 (ISO-8859-1)。在第二行,我們檢查目錄是否真的包含任何照片,如果沒有,則跳過批次的其餘部分。(實際上執行批次的其餘部分不會造成任何損害,因為
基本上,需要對初始程式碼進行兩項修改
但是,最簡單的做法是在批次檔本身中使用
這使我們能夠透過拖放來蒙太奇任意數量的影像
上面的程式碼假設作為命令列參數傳遞的檔案位於同一個目錄中,並且必須根據其檔案名的字母數字順序進行蒙太奇。 例如,這對於數位照片的索引是有意義的,因為這樣可以根據拍攝時間對其進行排序。 我們首先將檔案的目錄設定為目前目錄,這使得後續的程式碼更加簡潔。 然後我們將檔案名傾印到
在第一行中,我們檢查第二個命令列參數是否存在。 如果存在,則處理所有命令列參數 (%*)。 如果只有一個檔案被傳遞到腳本,則將模式設定為所有 JPEG 檔案。 這種簡單的模式匹配要求我們必須更改為目前的磁碟機(透過 %~d1)和目前的資料夾,即
這個腳本使用所有可用的 Alpha 合成方法 將兩個漸層影像合成在一起,讓您可以看到運算子如何影響影像色彩。上面僅顯示了它產生的一些影像。這與為 合成表格 生成的影像類似,因此您可以看到運算子如何影響影像色彩。由於上述幾行被假設為批次檔,因此我們必須將百分比符號加倍。上述腳本首先建立兩個正交(直角對齊)灰階影像,其漸層涵蓋整個灰階範圍。IM 指令
在 使用推移建立等角立方體 中給出了使用 UNIX 殼層腳本的類似範例。這個批次檔將色彩空間作為命令列參數「
我們也可以透過在 DOS 中使用管道將「
在此範例中,我們從輸出中篩選出包含「RGB」的行,並將其寫入檔案
在這種情況下,管道符號「
這個批次檔會將一個完整的檔案名稱作為命令列參數「
使用相同的
在上述批次檔中,照片的檔案名稱作為單個命令列參數提供,稱為「
我們現在將冒號('
這會導致從單個 ImageMagick 命令調用設置 DOS 變數「
在第一行中,我們通過 "
FX 表達式不僅可以生成數字,還可以生成多個數字,嵌入到更大的字符串中。例如,在帶圓角的邊框中,它被用於根據圖像寬度和高度信息直接生成複雜的繪製字符串。這個新增的功能,以及避免和進一步依賴其他外部程序,使得這種方法成為在批處理腳本中進行計算的首選方法。
這個示例批處理文件根據將放置時間日期字符串區域的平均亮度 (
在第一行中,我們查詢 ImageMagick 版本,使用
如果 Find(使用不區分大小寫的選項 /I 呼叫)找不到字串,它會設定 ERRORLEVEL。在更複雜的方法中,您可以改為檢查登錄機碼,而不再依賴 PATH
使用此程式碼,我們查詢 IM 的登錄機碼
影像作為單一命令列參數傳遞給腳本,這一點在腳本的第一行進行了測試。接下來,透過在語句前後顯示環境變數
然而,這只適用於小數點分隔符號設定為小數點的 Windows 版本,因為時間是根據地區設定提供的,而 fx 根據美國方案執行計算。與 VBScript 不同,無法在批次檔中變更地區設定(除非透過登錄檔變更整個機器的設定)。作為替代方案,可以將整個時間轉換為百分之一秒,這可以在整數運算中完成,也可以在稍後計算任何差異。基本程式碼如下
在分割時間程式碼的每個部分之前插入的「1」可以防止帶有前導零的數字被(錯誤地)解釋為八進制數。透過這種處理方式引入的「計算誤差」將在最後減去 36610100 來彌補。完整(且更優雅)的範例程式碼可以在這裡找到。另一種方法是 Windows 2003 Resource Kit 提供的 *TimeIt* 工具程式,可以在這裡下載。然而,官方只支援 Windows XP。
在第一行中,我們將地區設定設為美式英語 (1033),這(除了其他事項外)會將小數點分隔符號設定為小數點。否則,小數值將根據地區設定顯示,例如可能使用小數點而不是小數點,這在將此類值傳遞給 IM 時會導致問題。定義字串常數之後的兩行是標準開銷,因為我們始終需要一個
但 VBS 程式碼更直接,更容易修改,並且可以輕鬆擴展以進行錯誤檢查等。請注意,第二個 FOR 語句中不允許出現換行符,因此我們必須盡可能保持它的長度。
腳本首先串聯透過拖放傳遞給腳本的檔案名稱。然後,它透過一些簡單的字串操作在同一個資料夾中衍生出 JPEG 輸出檔案的名稱。最後,使用適當的參數呼叫 Montage。對於較大的腳本,將檔案名稱儲存在陣列中很方便
首先,我們透過
在這裡,我們使用 FileSystem 物件來確定父資料夾的名稱。但是,檔案副檔名的匹配是以通常的方式檢查的,因為 Files 物件只提供 Type 屬性。通常,檔案名稱必須按字母順序排序,因為拖放或傳送到會以隨機順序將它們傳遞給腳本。這可以透過氣泡排序來實現
右側顯示了上述概念更複雜的應用:一組影片幀已透過 VBScript 和 ImageMagick 掛載到兩個平行的「膠片條」上。穿孔給出了一個視覺提示,即幀的進展是從上到下,即逐列,與通常的從左到右然後從上到下的西方閱讀模式形成對比。執行該工作的整個腳本可以從 strip.zip 檔案中下載。邊注:每幀右上角的紅色時間碼是由 AVIsynth 腳本生成的。這些幀是透過從 VirtualDub 匯出而轉儲的。透過嵌入的時間碼,幀不一定是時間等距的,即可以根據需要在 Windows 檔案總管中選擇並傳送到放置在「傳送到」資料夾中的腳本。
第二個概念的一個實用應用是在將圖像透視映射到目標平面上,如 Fred Weinhaus 網站上的 演示 所示。 我們可以使用這個概念將透視失真的圖像「貼」到透視(大部分)正確的版本上,如右圖所示:在上半部分,左圖顯示了在一個小事故現場拍攝的照片。 右邊的照片是在後來參觀現場時從略微升高的位置拍攝的。在下半部分,事故照片(即平面的路面)通過透視變換映射到目標照片上。(這樣做的目的是可視化黑色汽車右前輪留下的微弱滑痕的方向角。)為了執行此任務,用戶必須在源圖像中選擇四個點及其在透視正確圖像中的目標點。我們可以手動完成此操作,通過在圖像查看器(如 IrfanView)中選取點來確定源圖像和目標圖像中的坐標,記下它們的坐標並將它們提供給轉換命令列。 然而,這項繁瑣的工作可以通過免費軟件 WinMorph 來簡化,它提供了一個方便的界面來完成這項工作:從兩張圖片中選取一些源點及其對應的目標點。 兩張照片中的黃色折線連接著每張照片中選擇的四個點。 然而,變形算法本身不適合執行透視校正。(該算法的基本功能在 IM 網站使用部分的 失真 部分進行了說明。Fred Weinhaus 的 ShapeMorph 腳本中演示了其在變形方面的可用性。)WinMorph 將其信息存儲在一個結構化文本文件中,該文件包含(除其他信息外)源和目標的文件名,以及源點和目標點的坐標。 因此,我們可以從 WinMorph 文件中導出 IM 透視失真所需的所有信息。 您可以下載文件 wmpr.zip 中涉及的所有文件和圖像的副本。
這裡我們使用選項 /c 調用命令處理器 cmd,以便在完成後自動關閉命令框。 為了調試,我們也可以使用 /k 選項調用它,它會保持命令框打開並允許我們讀取可能的錯誤消息。
簡介
IM 腳本在我的 Windows 電腦上有什麼用?
以下範例基本上假設您在 Windows 桌上型電腦上執行 IM,該電腦可能已連接到網路。嗯,市面上有很多現成的圖像處理程式,例如 Adobe Photoshop、Corel 的 Paint Shop Pro、IrfanView (http://www.irfanview.com/),甚至 GIMP (http://www.gimp.org/)。那麼,為什麼還要費心使用 IM 的命令列程式和腳本來處理圖像呢?使用 ImageMagick 而不是滑鼠驅動介面的真正優勢在於,您可以完全自動化例行操作,無論是針對單一檔案還是大量檔案。例如以下任務:-
- 大量格式轉換
- 許多 Windows 程式都提供此功能,例如 IrfanView。然而,IM 在圖像格式方面的多功能性是無與倫比的。例如,您可以將 PDF 的所有頁面轉換為一系列 JPEG(如果您的電腦上安裝了 GhostScript)。
- 縮小和預處理數位照片
- 將數位照片嵌入文字處理器文件時,通常應降低其解析度,以便更快地列印文件。如果您通過 PDF 印表機驅動程式(例如 FreePDF)將文件轉換為 PDF,則也是如此。預處理還可以包括色彩和鏡頭校正例程。
- 將您的標誌放置到大量數位照片中
- 對大量數位照片應用一系列操作
- 在利用滑鼠驅動程式完成一系列工作步驟後,您可能希望將這些步驟自動化,以便將來進行批次處理。 然而,腳本語言(例如 Adobe 的 Action Script)在 Windows 影像處理程式中並不常見。
- 將多個影像合併到目錄影像
-contrast-stretch
」所做的那樣,請參見歸一化和對比度拉伸)。 IM 腳本特別適用於公司網路中的生產用途,因為任何人都可以應用現成的腳本——終端使用者不一定需要了解後台發生的事情。 因此,影像上的標準工作流程步驟可以完全自動化(並且真正標準化)。 下面介紹的幾個腳本是為我們小公司(從事事故重建領域)的生產用途而衍生出來的。 我既不是傑出的 Windows 腳本程式設計師,也不太熟悉 IM 的命令列工具。 對於下面處理的一些問題,可能還有更優雅的方法。 我想說明的重點是- 演示使用 IM 命令列工具進行 Windows 腳本程式設計的一些基本技術。
- 證明基於 IM 的腳本的使用既不是為了藝術而藝術,也不是一種學術消遣。
- 證明 IM 的命令列工具可以在本地網路中(而不仅仅是在網路伺服器上)完成實際工作。
IM 命令列工具的可能環境
在 Windows 下,簡單的 IM 命令通常在 Windows 命令介面(通過啟動cmd.exe
運行的「DOS 介面」)中運行。 對於在冗長的命令列或一系列命令列中執行的複雜操作,最好編寫一個腳本。 對於一系列簡單的命令,這很可能是一個 DOS 批次檔,在 Windows 命令介面中執行。 然而,這種方法有其缺點,因為與常見的 UNIX 命令介面相比,批次檔命令集相當有限。 在 Windows 下運行 IM 時,您基本上有以下選擇- Windows 命令介面(「DOS 視窗」)
- 這由 Windows NT 4.0、Windows XP 及更高版本上的
cmd.exe
(32 位元模式)運行,並且存在於任何 Windows 電腦上。 請參見使用 DOS 介面和批次檔,以及關於轉換問題的特殊說明。 - Cygwin
- 一個類似 bash 的命令介面(http://www.cygwin.com/)。 使用此介面時,本使用指南其餘部分中介紹的 IM 範例可以完全按照給出的方式運行,因為您可以訪問 UNIX 風格的命令列介面。 請參見下面的使用 Cygwin。
- Windows 腳本宿主
- Windows 腳本宿主基於 .COM 技術。 它存在於任何現代 Windows 電腦上,並且 WSH 腳本比簡單的 DOS 批次檔強大得多。 Windows 腳本宿主提供多種程式設計介面,其中 VBScript(Visual Basic 腳本)和 JScript(Java 腳本)最為常見。 可以通過使用 Shell 物件的 DOS 介面命令
Run
或Exec
來調用 IM 命令列工具。 請參見下面的Visual Basic 腳本 (VBS)。 - Windows PowerShell
- 這個功能強大的工具是古老 DOS shell 的後繼者,基於 .NET 2.0 技術。PowerShell 隨附於 Windows 7 中,並由
powershell.exe
執行。您也可以在微軟網站上下載適用於 Windows XP 和 Vista 的版本。
有效地執行腳本
假設您有一個完美的 Windows 腳本(DOS 批次檔、VBScript 或其他),它將輸入檔案的名稱作為命令列參數,執行一些操作,然後將結果輸出為單一影像或一系列影像。您肯定不希望每次都啟動 DOS 命令介面(或替代方案),然後手動輸入檔案名稱來提供給腳本。為避免這種麻煩的操作方式,基本上您可以使用「拖放」或「傳送到」功能:使用「拖放」時,請將 DOS 批次檔或 VBScript(或其他)放在容易存取的位置,例如桌面或存放要處理之影像檔案的目錄。然後,在 Windows 檔案總管中選取要處理的檔案,然後將它們拖放到腳本檔案上。檔案名稱將作為命令列參數傳遞給腳本,並可在腳本中引用。或者,您也可以將腳本(或其連結)放在「傳送到」資料夾中。當您在檔案總管的檔案窗格中按一下滑鼠右鍵時,這個資料夾中的程式會出現在關聯式選單中。同樣地,所選檔案的名稱也會作為命令列參數傳遞給腳本。「傳送到」資料夾的名稱為SendTo
。它的位置似乎會隨著每個新的 Windows 版本而改變。一個萬無一失的尋找方法是在「執行」方塊中輸入 shell:sendto
。在 Windows XP 或更新版本中,單一命令列的長度可以達到 8192 個字元(= 213)。因此,如果您直接從命令列呼叫 IM 工具,無論是直接呼叫還是透過直接命名所有所需檔案的批次檔呼叫,都很難遇到這個限制。然而,「拖放」使用的是 ExecShell 常式,它限制字串長度「僅」為 2048 個字元(= 211)。由於所有檔案都使用完整路徑名稱(即磁碟機 + 路徑 + 名稱)傳遞,因此當路徑名稱過長時,透過 WSH 執行的批次檔和 VBScript 就可能會發生問題。一旦發生這種錯誤,腳本就無法正確處理,因為錯誤發生在腳本實際執行「之前」。在 Windows XP 中,解決方法通常是將檔案放在路徑名稱較短的位置。轉換問題
IM 的 Windows 安裝程式會將 IM 的程式目錄新增到搜尋路徑中,讓您可以直接從命令提示字元呼叫 IM 的命令列工具,而無需提供路徑名稱。預設情況下,您將使用 `magick` 作為您的命令列工具。但是,如果您選擇傳統程式名稱,則 IM 命令列工具的名稱會相當不具體(例如 convert、identify、compare ...),這會導致與其他程式的名稱衝突。特別是,convert 是一個 Windows 系統工具,位於 Windows 系統目錄中 (c:\Windows\system32\convert.exe
),它會將 FAT32 檔案系統轉換為現在通用的 NTFS。但還有其他程式也稱為「convert.exe」,例如 Delphi 報表轉換器工具程式。FAT → NTFS magick 工具最初隨附於 Windows XP,並與 IM 的命令列工具「convert
」產生名稱衝突,因為 IM 的程式目錄被**附加**到 DOS 搜尋路徑(即 PATH 環境變數),所以系統工具會先被找到,並且在舊腳本中對「magick
」的簡單呼叫無法正確解析。然而,目前版本的 IM Windows 安裝程式會將 IM 的程式目錄放在搜尋路徑的最前面,從而在發生名稱衝突時,通常會先找到 IM 的命令列工具。但是,其他同名工具程式(例如 Deplhi 的報表轉換器)也遇到了同樣的問題,並採用了相同的解決方案,即將其程式路徑放在路徑變數的最前面,這表示此解決方案並非萬無一失:如果在 IM 之後安裝 Delphi,則簡單呼叫 Convert 將會呼叫報表轉換器工具程式,而不是 IM 的 Convert。Windows XP 中引入 Convert 工具導致許多傳統腳本崩潰。常見的解決方案是將 IM 的 Convert 工具重新命名為其他名稱,例如「IMconvert
」(請注意,您無法重新命名系統命令,因為下一個 Windows 服務套件可能會直接還原它,而忽略重新命名的版本)。這個解決方案雖然現在已經不需要了,但仍然可以在網路上找到。避免未來可能發生命名衝突的最佳解決方案是在任何腳本中使用完整路徑名稱呼叫 IM 的命令列工具。也就是將其位置儲存在變數或常數中。因此,每個批次檔都應以以下幾行開頭
|
%PROGRAMFILES%
是一個環境變數,它會展開為程式目錄的名稱,例如英文版 Windows 中的「Program Files」和德文版 Windows 中的「Programme」。SETLOCAL
會將新環境變數(例如 IMCONV)的定義限制在批次檔的範圍內。這裡實際上並不需要 EnableDelayedExpansion
,但每次使用 SETLOCAL
時都應該養成使用這個選項的習慣;如需詳細資訊,請參閱批次檔程式設計指南。還有更複雜且萬無一失的方法來找出 IM 的安裝資料夾,這將在編輯、除錯和執行階段錯誤測試中討論。等效的 VB-Script 程式碼如下所示
|
字元編碼
ImageMagick 以 Unicode 編碼字串,更精確地說,是 UTF-8。相反地,DOS 使用字碼頁來編碼字元(主要是 8 位元)。這在將字串寫入影像時會產生問題,例如在使用「標籤」或「-title」時:當使用非 ASCII 字元時,簡單的方法就會出錯。例如,嘗試建立包含德文字母變音符號的標籤,例如「ä
」、「ö
」、「ü
」,您可以在 Linux 中簡單地使用以下內容...
|
|
echo
」建立此文字檔,前提是您事先將字碼頁切換為 UTF-8
|
Iconv.exe
」,這是一個也適用於 Windows 的 UNIX 工具。從 SourgeForge 下載安裝檔,然後將檔案安裝到標準目錄 C:\Program Files\GnuWin32
中。然後,在您的腳本中將 DOS 命令的輸出傾印到一個文字檔中,並在以下步驟中將該檔案轉換為 UTF-8
|
在 Windows 下安裝 ImageMagick
ImageMagick 持續開發中,新版本大約每月發佈一次。強烈建議使用最新版本的 IM,特別是在 IM 看似無法完全按照預期執行作業時。在大多數情況下,安裝當前版本即可解決問題。您可以在 https://imagemagick.dev.org.tw/script/binary-releases.php#windows 找到當前二進制版本的安裝程式。您也可以從 天文學與天文攝影部落格 下載具備 HDRI(浮點品質)和 FFT(快速傅立葉變換)功能的 ImageMagick 版本。預設情況下,IM 會將自身安裝在名為C:\Program Files\ImageMagick x.x.x-x
的程式目錄中,其中「x.x.x-x」代表其版本號碼。預設情況下,安裝程式建議在首次安裝 IM 時擴展 PATH 環境變數(即勾選「將應用程式路徑添加到系統路徑」)。如果您忘記解除安裝舊版本,則很快就會累積許多不同 ImageMagick 版本及其對應的 PATH 擴展。因此,我們辦公室養成了將 IM 安裝到 C:\Program Files\ImageMagick
的習慣,將較新版本安裝在較舊版本之上,並保持 PATH 環境變數不變。在多年的使用過程中,我們沒有發現這種做法有任何問題。如果您真的想知道 IM 版本號碼,可以隨時呼叫「convert -version
」,並且可以使用一個簡單的腳本來評估版本號碼,以防它依賴於特定的最低版本號碼。有關更多資訊,請參閱「編輯、除錯和執行時錯誤測試」一節。ImageMagick 會將一些登錄機碼寫入 HKEY Local Machine\Software\ImageMagick
。如果您要處理多個已安裝的 IM 版本,則最重要的機碼是 HKEY Local Machine\Software\ImageMagick\Current
,您也可以在其中找到 IM 二進制檔案的路徑,稱為 BinPath
。您可以在任何腳本開始時查詢此登錄項目,從而確定程式路徑,而不必依賴 PATH 環境變數。有關更多資訊,請參閱「編輯、除錯和執行時錯誤測試」一節。IM 的安裝程式提供了一個選項,可以通過「為 VBscript、Visual Basic 和 WSH 安裝 ImageMagickObject OLE 控制項」選項來安裝 ImageMagick 的 COM+ 物件。預設情況下不會勾選此選項,並且安裝 COM+ 物件並非在 VBScript 中使用 IM 的先決條件,這一點將在後文中得到證明。無論如何,您不應依賴在您自己的腳本目標電腦以外的電腦上安裝 COM+ 物件。在處理 PostScript 檔案時,ImageMagick 依賴另一個程式「Ghostscript
」來讀取 PostScript 和 PDF 檔案並將其轉換為它可以使用的圖像格式。也就是說,要讀取此類文件,需要在您的電腦上安裝 Ghostscript。您可以在 SourceForge 下載其最新版本。您安裝 GhostScript 和 ImageMagick 的順序並不重要。您不必在安裝 ImageMagick 之前安裝 GhostScript,而且 ImageMagick 在沒有安裝 GhostScript 的情況下也可以正常運行。只有當您想要處理 Postscript 或 PDF 檔案時才需要它。IM 會在執行時確定 Ghostscript 的位置,並從登錄表中查詢它。特性與陷阱
對於 Windows 程式來說,IM 允許將圖像寫入標準輸出 (stdout) 並從標準輸入 (stdin) 讀取圖像,因此可以使用管道來級聯圖像處理任務,這一點非常特別。以下操作
|
|
|
|
取得說明
命令列選項在IM 網站上有詳細的說明文件,但真正說明如何使用它們的是網站上的用法區塊。網站的這個區塊結構良好,允許您根據想要執行的任務採取面向問題的方法。然而,快速而簡便的方法是在網站的該區塊上進行 Google 搜尋,搜尋您想到的命令列選項。如果您想製作多個影像的蒙太奇,並且想瞭解 -tile 選項,則可以在 Google 上搜尋您將很快找到要點。請記住,這將顯示用於 UNIX / LINUX 環境的程式碼,這些程式碼必須略作調整才能在 Windows 下應用。另一個非常有用的資訊來源是 IM 討論區,也稱為Discourse Server 使用者論壇,您應該將其加入瀏覽器的書籤/我的最愛中。成為會員後,您就可以提出問題,這些問題大多會由知識淵博的使用者快速回答。輔助程式與替代方案
是的,這是真的。確實有一些工作,其他程式可以比 ImageMagick 做得更好。通常是那些針對特定格式設計的程式,而不是 ImageMagick 提供的通用影像處理。- IrfanView可能是 Windows 下最常見的影像檢視器,它也允許一些基本的影像處理。
- 像 Adobe Photoshop 或Gimp這樣的 GUI 程式更適合直接編輯和測試複雜的影像處理步驟。
- 對於數位照片的 EXIF 標頭的操作,Jhead和ExifTool比 ImageMagick 更通用。
- 從 PDF 中提取 JPEG 資料流應該使用xPDF來完成。
- 影片處理最好使用VirtualDub來完成,最好是與AviSynth及其編輯器AvsP結合使用。
使用 Cygwin
如上所述,ImageMagick 在設計時考慮了 UNIX 和 Linux,因此最簡單的方法可能是在您的 Windows 系統上安裝一個 Bash shell,並運行已經為該系統編寫的各種 IM 腳本,例如Fred Weinhaus 的腳本。Cygwin - 正如其開發人員所說,它為 Windows 提供了一個「類似 Linux 的環境」。它包含 Linux shell 中通常可用的所有工具。我在 Cygwin 的 Bash shell 下測試了一些 Fred Weinhaus 的 bash 腳本,發現它們功能齊全。在 Cygwin 網站的根頁面底部,您會找到一個標記為立即安裝或更新!的連結,該連結將下載一個名為 Setup.exe 的安裝程式。當您啟動此程式時,它將提供一個站點鏡像列表。在您選擇其中一個之後,例程將提供它將安裝的工具的樹狀視圖。標準選擇對我來說似乎是合理的,因此您可以繼續。然後,安裝例程將下載所需的套件並在您的電腦上安裝 Cygwin。![]() ![]() |
安裝時,請確保包含「bc 」套件,該套件預設情況下未啟用。它可以作為一個選項從 Cygwin 安裝面板安裝。這是一個浮點數學工具,在 IM 腳本中至關重要,例如 Fred Weinhaus 使用的腳本。 |
- 您可以使用
CD
命令更改當前目錄,這與 DOS 中的命令類似。但是,反斜線 ("\") 必須用正斜線 ("/") 代替。如同在 DOS 下,磁碟機也透過CD
更改。因此,CD w:
將切換到磁碟機 w:。與一般的 Unix 環境不同,路徑名稱不區分大小寫。可以使用特殊字元,例如變音符號。對於某些命令,磁碟機名稱必須以特殊語法傳遞,避免使用冒號。例如/cygdrive/w/test
。 - Cywin 會讀取 Windows 的 PATH 環境變數,並相應地設定自己的 PATH。您可以透過在 Bash shell 中輸入
echo $PATH
來檢查。注意:與 Windows 不同,環境變數的名稱區分大小寫,因此在引用 PATH 時必須使用大寫字母。 - 與 Windows 不同,預設情況下,當前目錄不在搜尋路徑中!例如,如果 shell 腳本「autolevel1」位於
W:\scripts
中,則在呼叫 shell 腳本時,您不能只切換到該目錄。您必須在腳本開頭至少附加一個最小的目錄位置,如下所示:./autolevel1
(對於位於當前目錄中的腳本)。或者腳本的完整路徑,如下所示:/cygdrive/w/scripts
。 - 或者,您可以使用
PATH=$PATH:/cygdrive/w/scripts
將該腳本目錄明確附加到搜尋路徑。由於冒號用作路徑分隔符號,因此您必須使用這種特殊的命名法,例如/cygdrive/w/scripts
而不是w:/scripts
。
使用 DOS Shell 和批次檔
轉換腳本:UNIX Shell 到 Windows DOS
當直接從 DOS 命令 shell(使用cmd.exe
)呼叫 IM 命令時,您必須修改 IM 的範例網站上顯示的腳本(如果它們並非來自本節),因為提供的大多數範例(在其他節中)通常旨在 UNIX 或 LINUX 命令 shell 中執行。為了從 DOS 命令 shell 執行它們,您必須執行以下修改- 大多數情況下,必須使用雙引號 '
"
' 來代替單引號 ''
',以便命令參數保持正確。請注意引號內的引號,例如-draw
運算符。您可以在 DOS 雙引號參數中使用單引號,因為這些引號會傳遞給 IM 處理,而不會由腳本處理。 - 顯示的範例行尾出現的反斜線 '
\
' 表示「行繼續」,它會將下一行附加到同一個命令行序列。將它們替換為 '^
' 字元,以表示 DOS 批次檔中的行繼續。對於 DOS,下一行也需要以空格開頭,但這是相當標準的做法,因此應該不會造成太大問題。您也可以將所有行附加到一行並刪除這些反斜線,儘管這會使編輯和後來的命令閱讀變得更加困難。因此,不建議使用這種做法。 - 如果在字面意義上使用(即沒有實現其通常用途),則所有未包含在雙引號中的保留 shell 字元都必須使用 '
^
'(插入符號或抑揚符號)進行轉義。這些保留的 shell 字元是:'&
'、'|
'、'(
'、')
'、'<
'、'>
'、'^
'。這尤其意味著- 特殊字元 '
>
'(用於調整大小的幾何形狀)需要使用 '^
' 進行轉義。例如「-resize 100x100^>
」 - 同樣,'內部調整大小' 標誌 '
^
' 需要加倍為 '^^
'。
- 特殊字元 '
- 在 UNIX shell 中,不需要使用反斜線「
\
」來跳脫括號「()
」或驚嘆號「!
」。 - 否則,當遇到需要跳脫的字元,例如「
<
」和「>
」時,UNIX shell 中的反斜線「\
」需要替換為脫字符「^
」。
例如:「-resize 100x100\>
」將變為「-resize 100x100^>
」。 - 在 DOS 批次檔中,百分比符號「
%
」也具有特殊含義,因為它引用了命令列參數。例如,%1, %2, ...
(在 UNIX shell 中,使用「$」符號表示相同的通用含義)。在 DOS 批次檔中,單個百分比符號(如「FOR
命令」中所示)需要加倍為「%%
」。ImageMagick 本身通常只檢查是否存在百分比符號,而不關心是否給出了多個百分比符號。因此,除非它是文字標籤或註釋字串的一部分,否則加倍所有百分比符號通常不會造成損害。 - 請記住,Windows 檔名可以包含空格字元。空格也可以在 UNIX 下使用,但不太常見。此類可能包含空格的檔名必須包含在雙引號中,例如
"file name.jpg"
或"file name".jpg
。透過拖放或「傳送到」作為命令列參數傳遞給腳本或批次檔的檔名需要特別注意,因為如果它不包含空格字元,則會在沒有引號的情況下傳遞給腳本;如果包含空格字元,則會在帶引號的情況下傳遞。 - UNIX shell 腳本中的註釋以一行中任何位置的未加引號的「
#
」開頭,並持續到行尾。顏色設定(例如紅色「#FF0000
」)通常會用引號引起來,以移除此特殊含義。在 DOS 下不需要此引號,但在它們周圍使用雙引號「"
」並不重要,並且應該保留。在 DOS 中,註釋只能出現在使用「REM
」、「@REM
」或「::
」前綴的行首。儘管它們也會持續到行尾。您可以選擇使用哪種註釋方法。但是,始終建議在任何批次檔中使用良好的註釋,以便您在幾個月或幾年後回顧腳本時,知道命令在每個步驟中嘗試執行的操作。這也讓其他人更容易理解。所有腳本都應以較大的註釋開頭,說明腳本的功能及其使用方法。這只是一個良好的程式設計習慣。 - 執行 DOS 批次檔時,預設情況下會顯示單個命令。也就是說,命令會顯示在輸出 DOS 框中。在 UNIX 下,您需要新增特殊命令或選項才能以這種方式列印正在執行的命令。您可以透過以「
@ECHO OFF
」啟動腳本來關閉此「顯示」輸出。UNIX shell 腳本中的特殊起始註釋「#!/path/to/shell
」對於 DOS 批次檔不是必需的。因此,對於 DOS 批次檔,可以用「@ECHO OFF
」命令替換此行。
|
|
cim.txt
如下所示(去除任何註釋後)
|
cim.txt
放在要轉換的 Linux shell 腳本所在的資料夾中,則可以透過以下命令呼叫轉換
%programfiles%\GnuWin32\bin\SED -f cim.txt linux.scr > windows.bat |
SET SP=%programfiles%\GnuWin32\bin %SP%\SED -f %SP%\cim.txt "%~1"> "%~dpn1.bat" |
cim.txt
放置於 SED 的程式資料夾中。它會將 Linux shell 腳本的檔名作為唯一的命令列參數,並在同一個資料夾中產生一個具有相同名稱但副檔名為「.bat」的批次檔。(下一節將說明神秘的檔名操作「%~dpn1.bat」。)請注意:上述 SED 腳本只會執行上述的基本替換。它不會將複雜的 Linux shell 腳本(如Fred Weinhaus 網站上提供的腳本)轉換成等效的批次檔!批次檔中的檔名處理
如上所述,IM 在將標準處理步驟序列應用於圖像檔時特別有用。在這種情況下,檔名將作為命令列參數傳遞給腳本,可以透過拖放或「傳送到」。使用這些技術,傳遞給 DOS 批次檔的檔名將是一個完整的檔名,即包含磁碟機名稱和目錄路徑。您可以透過將檔案拖放到以下批次檔來測試這一點
|
PAUSE
語句,DOS 視窗將保持打開狀態,直到用戶按下一個鍵,以便您可以檢查結果。嘗試使用包含空格的檔名執行上述操作,您會注意到檔名將用雙引號括起來。請注意,在此處以及所有後續範例中,我們假設任何網路檔案都已分配了磁碟機代號。實際上,我從未在本地商業網路中看到過不同的情況。在使用批次檔時,您不應嘗試處理 UNC 名稱:您可能會讓批次檔正常工作,但這會給您帶來很多不必要的麻煩。當在轉換命令列中使用此檔名時,此行為可能會導致問題。讓我們執行一個從任何其他格式到 JPEG 的簡單轉換。最基本的代碼是
|
|
~
運算符來操作檔名%~1 | 展開 %1,移除任何周圍的引號 (") |
%~f1 | 將 %1 展開為完整的路徑名 |
%~d1 | 將 %1 僅展開為磁碟機代號 |
%~p1 | 將 %1 僅展開為路徑 |
%~n1 | 將 %1 僅展開為檔名 |
%~x1 | 將 %1 僅展開為檔案副檔名 |
%~dpn1
」表示「磁碟機 + 路徑 + 沒有副檔名和括號引號的名稱」。因此,我們必須用雙引號將名稱括起來,這樣代碼也適用於包含空格的檔名。(如果沒有,引號也沒有壞處。)PAUSE
語句僅用於測試目的,可以在最終的批次檔中刪除。如果您只想測試您的代碼而不實際調用 IM,您應該寫入
|
批次處理多個檔案
FOR 迴圈
DOSFOR
命令可用於以類似於 UNIX 的方式處理一系列檔案。為了將當前目錄中的所有 JPEG 檔案縮放 50%,您可以在 DOS 視窗中輸入以下行
|
|
shell:sendto
)中的 DOS 批次檔。在這種情況下,我們應該在第一步中將檔案的目錄設為當前目錄
|
- 透過提供磁碟機名稱(d: 或其他名稱)來更改磁碟機
- 將檔案所在的資料夾設定為當前目錄
- 建立一個名為「small」的子目錄
- 將所有 JPEG 檔案縮小 50%,並將這些縮小後的版本放置在新建立的子目錄中。
CD "%~p1"
。如果是 CD
命令,我們甚至可以省略括號引號,因為此命令只接受一個參數,因此可以在沒有括號引號的情況下處理空格。在第一步中將檔案的目錄設定為當前目錄會使後續步驟更容易一些,因為對檔案名稱的引用會變得更容易和簡短一些。但是,我們也可以這樣寫
|
%%a
。注意二:最後的反斜線是路徑名稱的一部分。因此,它必須是 "%~dp1small"
,而**不是** "%~dp1\small"
,這並不會使程式碼更易讀,尤其是在 "%%~dpasmall\%%~nxa"
的情況下。FOR
語句有幾個缺點和注意事項。其中之一是,您基本上只能在 DO
之後執行一個命令。但是,您可以將一系列 DOS 命令組合在括號「(」,「)」中,從而執行簡單的命令序列
@ECHO OFF :: Lighten darker areas of all images in a directory %~d1 CD "%~p1" FOR %%a in (*.jpg) DO ( ECHO Processing file: "%%~nxa" magick %%a -blur 30 -negate %%a.miff magick composite %%a.miff %%a -compose overlay "%%~dpn1_light"%%~xa DEL %%a.miff ) PAUSE |
.miff
」副檔名的檔案中。然後,它會將原始影像疊加在此修改版本之上,從而使原始影像的較暗部分變亮。最後,刪除中間影像。請注意,在上面的程式碼中,必須強調**簡單的命令序列**:您不能在區塊內使用 GOTO
跳轉。如果您需要這種行為,則必須通過 FOR
迴圈呼叫另一個批次檔
%~d1 CD %~p1 MD small FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa" |
process.bat
」是執行實際工作的批次檔,它與呼叫批次檔位於同一個目錄中。命令列參數 0(「%0
」)是批次檔本身的名稱,因此「%~dp0process
」呼叫與其位於同一個目錄中的批次檔 process.bat
。FOR
語句只提供檔案名稱,通過「%~fa
」將其轉換為完全限定的檔案名稱。在本例中,批次檔 process.bat
中的程式碼與上面範例中括號之間的程式碼相同
magick %%1 -blur 30 -negate %%1.miff magick composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1 DEL %%1.miff |
process.bat
腳本(使用 ECHO
),從主迴圈中呼叫它,然後在作業完成後將其刪除
ECHO magick %%1 -blur 30 -negate %%1.miff >%~dp0process.bat ECHO composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1 >>%~dp0process.bat ECHO DEL %%1.miff >>%~dp0process.bat %~d1 CD %~p1 MD small FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa" DEL %~dp0process.bat |
ECHO
命令時,我們必須再次跳脫任何特殊的 DOS 字元,尤其是百分比符號。是的,IM 可以使用單個處理命令完成上述所有操作,而不需要「.miff
」中間影像,但這不是本例的重點。批次處理(子)目錄樹
有幾種技術可以處理(子)目錄樹中的所有檔案。最簡單的方法是在FOR
語句中使用「/R
」標誌,使其迴圈處理當前目錄下所有子目錄中的所有檔案。為了將子目錄樹中的所有 TIFF 檔案都轉換為 JPEG 格式,您只需鍵入
|
/R
" 旗標時,您將會循環瀏覽整個子目錄樹,而無法選擇排序或篩選檔案。在接下來的範例中,我們將為所有子目錄產生照片索引列印,並將這些索引列印放置在根目錄中。這提供了一種簡單的方法來執行特定照片的視覺搜尋,類似於 Windows 檔案總管中的預覽,但不需要每次搜尋都重新掃描整個目錄樹(這非常耗時)。首先,我們透過兩個批次檔來解決這個問題,一個執行迴圈,另一個執行實際工作。索引列印將會是低品質的 JPEG 檔案,命名為 IDX_0001.jpg、IDX_0002.jpg、IDX_0003.jpg
等等。首先,我們建立迴圈
DEL IDX_????.JPG SET COUNT=0 FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO CALL c.bat "%%a" DEL title.txt |
IDX_nnnn.JPG
檔案名稱。在第三行,我們透過 DIR /S /B /AD
建立所有子目錄的清單,提取包含 "Porsche"(使用 /I
選項不區分大小寫)的目錄,並對這個篩選後的清單進行排序。排序將確保 IDX 檔案的數字順序與目錄路徑名稱的字母順序一致。選項 "delims="
將禁止在第一個空格後截斷行的標準行為。呼叫批次檔 C.BAT
時,我們用引號將路徑名稱括起來,以確保正確處理空格。在最後一行,我們刪除由批次檔 C.BAT
建立的臨時檔案。現在我們來看看實際的工作
CHCP 1252 DIR %1\*.jpg>nul || GOTO :EOF :: Generate IDX filename SET /A COUNT+=1 SET TFILE=000%COUNT% SET TFILE=IDX_%TFILE:~-4%.jpg :: Generate title without bracketing quotes ECHO %~1>temp.txt "C:\Program Files\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 temp.txt>title.txt montage -geometry 210x140+0+5 -tile 6x -title @title.txt %1\*.jpg -quality 30%% %TFILE% jhead -cl %1 %TFILE% |
magick montage
只會產生空白輸出,但 IDX 檔案的計數將不再連續。)從 Windows XP 開始,有一個特殊的 GoTo 目標標籤 :EOF
,它允許在不定義相應標籤的情況下終止執行。然後,我們透過遞增 "COUNT
"、附加一些前導零並透過 %TFILE:~-4%
提取最後 4 個字元,然後將其串聯起來建立 "IDX_nnnn.jpg
" 形式的檔案名稱,從而產生索引檔案的檔案名稱 "TFILE
"。稍後的 使用 SET 進行計算 將說明使用 SET /A
語句執行計算。在接下來的幾行中,我們移除路徑名稱 "PNAME
" 的引號,並將結果儲存在中間檔案 'temp.txt
' 中,並透過 "Icon.exe
" 將其轉碼為 Unicode (UTF-8)(請參閱 "字元編碼")。然後,IM 的 Montage 會讀取儲存在 'title.txt
' 中的 Unicode 字串。這確保了字串按字面處理,因此我們不必在 Windows 路徑名稱中使用跳脫字元。然後,Montage 將照片按六行組合起來(-tile 6x
),並使用路徑名稱作為標題。產生的索引列印寬度為 1260 像素,並以 30% 的 JPG 品質儲存,以減少儲存空間需求。在最後一行,我們使用程式 JHEAD 將路徑名稱寫入 JPEG 註解中。這提供了在 Windows 檔案總管中透過文字搜尋檔案中檔案名稱的特定子字串來篩選索引列印的可能性。我們可以將兩個批次檔組合起來,將 "工作批次" 的程式碼放到 FOR
迴圈中
SETLOCAL EnableDelayedExpansion SET ICONV="%PROGRAMFILES%\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 CHCP 1252 DEL IDX_????.JPG SET COUNT=0 FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO ( DIR "%%a\*.jpg">nul IF !ERRORLEVEL!==0 ( SET /A COUNT+=1 SET TFILE=000!COUNT! SET TFILE=IDX_!TFILE:~-4!.jpg ECHO %%a >temp.txt %ICONV% temp.txt>title.txt montage -geometry 210x140+0+5 -tile 6x -title @title.txt "%%a\*.jpg" -quality 30%% !TFILE! jhead -cl %%a !TFILE! ) ) DEL temp.txt DEL title.txt |
- 我們必須啟用**延遲擴充**,並透過用驚嘆號而不是百分號括住環境變數來引用
FOR
迴圈中使用的環境變數。 - 我們必須避免使用會重置命令處理器的
GOTO
語句。
FOR
迴圈內的環境變數在執行時**不會**被評估。 相反地,程式碼會使用括號中給定的清單進行預先處理。 因此,在 FOR
迴圈內對 %COUNT%
的參照始終會傳回相同的值。 為了啟用環境變數的執行時評估,您必須開啟延遲擴展。 這可以在透過 cmd /V:on
呼叫命令處理器時完成,或者可以使用以下 REG 檔案在登錄檔中普遍開啟
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor] "DelayedExpansion"="1" [HKEY_CURRENT_USER\Software\Microsoft\Command Processor] "DelayedExpansion"="1" |
SETLOCAL EnableDelayedExpansion
設定此選項,這也會將環境變數的任何更改限制在目前版本的命令處理器中,這可能是您想要的。 現在,在迴圈內對環境變數的執行時值的參照必須使用驚嘆號而不是百分號。 在 FOR
迴圈內使用 GOTO
語句可能會導致非常細微的錯誤,因此應避免使用。 但是,在我們的批次檔中,我們可以輕鬆地透過將程式碼區塊與蒙太奇程式碼括起來的 IF
語句來交換跳轉。 批次處理任意數量的檔案
在 DOS 批次檔中,只能透過%1
到 %9
直接處理九個命令列參數。 在舊版的 Windows 中,您只能透過 SHIFT
命令來規避此限制,這會導致命令列參數的循環移位。 在較新版本中,可以在 For 迴圈中處理命令列參數
FOR %%i in (%*) DO ... |
@ECHO OFF SETLOCAL EnableDelayedExpansion %~d1 CD "%~p1" DEL Files.txt 2>nul: DEL FSorted.txt 2>nul: FOR %%I in (%*) DO ECHO %%~nxI>>files.txt FOR /F "delims=" %%A in ('TYPE files.txt ^| Sort') Do ( ECHO %%A>>fsorted.txt ) SET MONTAGE=montage -tile 3x FOR /F "delims=" %%A in (FSorted.txt) Do ( SET MONTAGE=!MONTAGE! %%A ) SET MONTAGE=%MONTAGE% result%~x1 %MONTAGE% DEL Files.txt DEL FSorted.txt |
files.txt
中。 即使檔案是按字母順序挑選的,我們也不能依賴這種排序在檔案名被傳遞到腳本時會被保留下來。 因此,我們在第二個工作步驟中對檔案進行排序,將它們傾印到 fsorted.txt
中。 然後,我們根據該檔案在另一個 For 迴圈中建構蒙太奇命令列。 蒙太奇輸出檔案使用與第一個輸入檔案相同的副檔名 (%~x1
)。 (假設所有檔案都使用相同的副檔名。) 請注意,最終的蒙太奇命令只是透過評估環境變數來呼叫的,即 %MONTAGE%
。正如在 中所述,在 Windows XP 下傳遞大量具有長(完整)檔案名的檔案可能會遇到問題,因為 ShellExecute 的參數清單限制為 2048 個字元。 批次檔無法處理此錯誤,因為它發生在**控制權交給批次檔之前**。 一種可能的基於腳本的解決方案是在只有一個檔案被傳遞到批次檔時處理目錄中的所有影像檔案
%~d1 & IF EXIST %1\* (CD %1) ELSE CD %~p1 IF "%2"=="" ( SET PATTERN=*.jpg ) ELSE ( SET PATTERN=%* ) FOR %%v IN (%PATTERN%) DO (...) |
- CD %1 如果資料夾名稱被傳遞到腳本
- CD %p1 如果檔案名稱被傳遞到腳本。
從 ImageMagick 取得資訊
重複使用 IM 命令的輸出
在最近版本的 Windows 中,「FOR
」語法變得更加強大,請參閱 DOS「For」指令說明。藉由使用「/F
」選項,您可以從檔案、字串或其他 DOS 指令或其他程式的輸出讀取替換變數的輸入。後者在使用 IM 時特別有用。若要大致了解 IM 的疊加方法實際上是什麼,您可以使用以下批次檔
|
![]() Src |
![]() Dst |
![]() |
![]() Multiply |
![]() Screen |
![]() Overlay |
Convert -list compose
將提供我們一份可能的選項清單,每個選項都放在單獨的輸出行中。請注意,在括號中引用指令時,我們必須使用單引號。使用「/F
」選項,「FOR
」指令將會處理這些輸出行中的每一行,並將其傳遞給由 DO
執行的指令。因此,將套用 IM 所知的所有疊加方法來疊加兩個漸層影像。輸出檔案的名稱會根據疊加方法命名。 在下一個範例中,我們將說明 IM 提供的色彩空間。我們使用與上述相同的漸層技巧來產生立方體的表面,這些表面由色彩空間的三個座標所跨越
|
![]() 色彩空間 RGB |
![]() 色彩空間 sRGB |
%1
」。然後,它會產生立方體的三個側面,並對其進行推移和安裝,以便我們獲得等角視圖,其中點 (0,0,0) 位於六邊形的中心。最終圖片以色彩空間(即「%1
」)命名,並儲存為 PNG。我們現在想要從另一個提供色彩空間名稱的批次檔呼叫這個批次檔(儲存為「cspace.bat
」)
|
-list
」選項的輸出進行篩選
magick -list colorspace | FIND "RGB" >>clist.txt FOR /F %%A in (clist.txt) DO CALL cspace %%A DEL clist.txt |
clist.txt
。這個檔案隨後會被用作 FOR /F
指令的輸入。我們也可以在一次執行中完成此操作,避免使用臨時檔案
|
|
」必須進行跳脫,因為它沒有用雙引號括起來(僅用於 FOR
語句的單引號),而且(至少在上面的命令列中)不是其通常的含義。處理單行輸出
這個技巧也可以有效地應用於單行輸出。例如,我們可以應用自動伽瑪校正,透過 Fred Weinhaus 的網站 上說明的技術,將圖片的平均亮度大致設定為量子範圍的中間值(例如,對於 8 位元的色彩深度,則為 127)
|
%1
」傳遞,通常是透過拖放或「傳送到」。然後,IM 的 Identify 命令的輸出會提供一個伽瑪值,它會將影像的平均亮度設定為其動態範圍的中間值。此值是使用 FX 格式運算式 計算的。Identify 命令的單行輸出會儲存到「%%a
」變數中,並作為 Gamma 運算子 的參數傳遞給 Convert 命令。![]() ![]() |
FOR 命令在處理續行時似乎相當敏感:如果您要使用它們,請確保下一行不要以空格開頭。 |
![]() ![]() |
這種自動伽瑪校正方法現在已使用「-auto-gamma 」內建到 IM 中,並已新增到 IM v6.5.5-1 中。但它顯示了重複使用命令輸出以供稍後命令參數使用的技巧。 |
FOR
技巧,我們可以從嵌入在照片中的 EXIF 信息中讀取數據,並將其寫入影像的左上角
|
![]() ![]() |
照片通常使用 JPEG 格式儲存。讀取和重新儲存 JPEG 影像會因為 JPEG 失真壓縮 而導致影像品質略有下降,因此不建議儲存回 JPEG 格式。 |
%1
」。Identify 命令從 JPEG 檔案內的 EXIF 信息中讀取拍攝照片的日期和時間。然後,FOR
命令將此輸出傳遞給 Convert,後者在左上角對應地標註照片。EXIF 日期和時間信息的格式為「yyyy:mm:dd hh:mm:ss」,例如「2006:12:26 00:22:38」。因此,日期和時間之間用空格分隔。默認情況下,FOR
語句只會在每一行中找到第一個標記(「單詞」),並使用製表符和空格作為標準分隔符。因此,在上面的示例中,標準處理只會處理日期,而不會處理時間。使用選項「tokens=1,2
」,我們聲明我們對兩個標記都感興趣,它們被命名為連續的,即「%x, %y
」。但是,我們可以使用以下代碼更改日期的非常規格式
|
:
')定義為附加分隔符,導致日期被分成三個標記「%i
」、「%j
」、「%k
」。找到的下一個分隔符是分隔日期和時間的空格字符。使用星號(「*」),我們要求將行的其餘部分存儲在第四個標記「%l
」中。我們現在可以根據需要設置日期格式。在上面的示例中,我們選擇了英美表示法「mm/dd/yyyy」。從單一命令設定多個值
從一個 ImageMagick 命令設置多個值的技巧是讓命令格式化數據,以便您可以設置多個變數。
|
Width
」和「Height
」。執行計算
DOS 命令解釋器在計算方面很差。您可以使用它來執行簡單的整數運算。但是,要進行更複雜的浮點數學運算,您可以訪問 IM 的 FX 格式運算式 或第三方 DOS 計算器程序。使用 IM 的 FX 運算式
IM 的 FX 格式表達式 可用於浮點數學運算,並且可以將該數學運算添加到更大的格式化字符串中,如處理單行輸出一節的第一個示例所示。通過使用SET
命令,結果可以存儲在環境變量中,並在稍後的批處理文件中使用。舉個簡單的例子,我們可能希望根據照片的尺寸調整上面例子中字體大小的日期時間字符串
|
%[fx:min(w,h)]
" 評估照片的較小尺寸,取該值的 5%,並將其存儲在環境變量 PSIZE 中。該值在下一條語句 (%psize%
) 中被引用,用於設置時間日期信息的字體大小。在這裡,我們計算了一個介於 -15° 到 +15° 之間的隨機角度作為整數,以創建旋轉的縮略圖。
|
使用 SET 命令
當調用 "/A
" 選項時,SET
命令可以執行一些簡單的整數數學運算和一些基本的字符串操作。在下面的例子中,我們使用 SET
命令粗略計算時間日期字符串的寬度
|
%mean%
) 選擇其顏色。如果平均顏色強度小於 50%,則字符串為白色,否則為黑色。該示例還使用了 IF
語句。請注意,ELSE
部分必須放在同一行,並且第一個命令必須用括號括起來。 使用其他外部計算器
或者,您可以使用提供浮點數學運算的 DOS 程序,例如 EVAL。如果您將此文件放在 IM 程序目錄或 Windows 系統目錄中,則可以在任何 DOS shell 窗口中執行浮點計算。通過使用EVAL
程序、FOR
命令和環境變量,我們可以使上面的顏色立方體示例更加靈活,並且其各種計算更加透明
|
編輯、除錯與執行階段錯誤測試
原則上,DOS 批次檔可以用任何編輯器撰寫,甚至可以使用 Windows 的記事本。但是,您應該使用具有 DOS 批次檔語法突顯功能的編輯器。我個人認為 Notepad++ 是最佳選擇,但談到編輯器往往會引起人們的激烈爭論。所以,是的,任何其他編輯器都可以。據我所知,市面上沒有免費的批次檔 IDE(整合開發環境)。有人可能會認為這應該是作業系統隨附的功能,但事實並非如此。到目前為止,我所有的批次檔都是用 Notepad++ 撰寫的,但對於那些經常撰寫批次檔的人來說,Running Steps 批次檔 IDE 可能會有所幫助。它是一款共享軟體,價格約為 80 美元。您可以在 http://www.computerhope.com/msdos.htm 找到 DOS 命令的完整說明。與 DOS 批次檔語言本身一樣,除錯批次檔也是一件相當奇特的事情。我會先在 DOS 視窗中測試任何批次檔。在測試拖放或傳送到時,建議在批次檔的結尾加上PAUSE
陳述式,以便批次作業完成後 DOS 視窗保持開啟狀態。考慮到執行階段錯誤訊息,一般的做法是檢查 DOS 的 ERRORLEVEL
並跳轉到由 ECHO
命令產生的相應錯誤訊息。我發現最常見的錯誤來源之一是執行腳本的電腦上找不到 Convert 程式。因此,如果您打算與他人共用您的批次檔腳本,您應該首先檢查 Convert 是否可存取
@ECHO OFF magick -version 1>nul: 2>nul: IF NOT %errorlevel%==0 GOTO NoMagick: magick ... GOTO :EOF ... :NoMagick ECHO ImageMagick (convert.exe) not found. PAUSE |
1>nul:
(或僅使用 >nul:
)抑制標準輸出,並使用 2>nul:
抑制任何錯誤訊息,也就是說,我們將 stdout
和 stderr
重新導向到 nul:
。如果呼叫 IM 的 Convert 失敗,則會改為呼叫系統程式 Convert,該程式無法處理 -version
選項,並且會設定 ERRORLEVEL 變數。您可以嘗試找出 Convert 找不到的原因並嘗試解決問題:您可以判斷 IM 的程式路徑是否為環境變數 PATH 的一部分
@ECHO OFF PATH | FIND /I "ImageMagick" IF NOT %errorlevel%==0 GOTO NoPath: ... :NoPath ... |
@ECHO OFF FOR /F "tokens=1,2,*" %%A in ^ ('reg query "HKCM\Software\ImageMagick\Current" ^| FIND "BinPath"') DO ^ SET MPATH=%%C IF [%MPATH%]==[] GOTO NoMagick: "MPATH\convert.exe" ... ... :NoMagick ... |
Current
並搜尋項目 BinPath。輸出的關鍵行是:LibPath REG_SZ C:\Program Files\ImageMagick
這行文字中的「單字」以定位點(在 Windows XP 中)或多個空格(Windows Vista)分隔。這些是 For /F
使用的標準分隔符號。第三個「單字」(%%C)是我們要找的,我們將其儲存在環境變數 MPATH 中,稍後在腳本中呼叫 magick 時可以使用它。腳本可能需要安裝特定最低版本的 ImageMagick。例如,透視變形方法 最初是在 6.3.5-9 版本(2007 年 9 月)中實作的。因此,如果您的腳本處理透視校正,您應該測試 IM 的已安裝版本是否比該版本更新
@ECHO OFF SETLOCAL EnableDelayedExpansion SET MINVERSION=7.5.3-0 FOR /F "tokens=1,2,3" %%a in ('magick -version ^|FIND "Version"') DO SET VERSION=%%c IF %VERSION% LSS %MINVERSION% GOTO GetNewVersion: Goto :EOF :GetNewVersion ECHO This Script requires et least ImageMagick version %MINVERSION%. ECHO Yours is %VERSION%. PAUSE Goto :EOF |
SETLOCAL
會將所有環境變數的變更限制在目前的腳本中,這樣我們就不必擔心副作用。選項 EnableDelayedExpansion
在這裡並不是必須的,但在使用 SETLOCAL
時,最好養成使用這個選項的習慣。然後,我們將最低需求版本儲存在環境變數 MINVERSION 中。在第三行,我們呼叫帶有 '-version' 選項的 Convert,透過 ^|FIND "Version"
從輸出中提取第一行,從該行中取得第三個單字,並將其儲存在環境變數 VERSION 中。然後,在第四行中,我們將此版本與最低需求版本進行比較。最佳化執行時間
要測量執行時間,您可以顯示%TEMP%
環境變數的內容。以下腳本測試了各種計算(大型)影像檔案(例如數位照片)平均亮度的方法
IF "%1"=="" GOTO :EOF ECHO %TIME% Identify -verbose %1 | FIND "mean" & ECHO %TIME% copy %1 %TEMP%\*.* & ECHO %TIME% Identify -verbose %TEMP%\%1 | FIND "mean" & ECHO %TIME% Convert %TEMP%\%1 -format %%[fx:mean] info: & ECHO %TIME% Convert %TEMP%\%1 -resize 1x1! -format %%[fx:mean] info: & ECHO %TIME% DEL %TEMP%\%1 |
%TIME%
來測量各種方法的執行時間。符號 &
允許在一行中放置多個 DOS 命令,這裡只是用來縮短程式碼所需的空间。如果影像位於網路磁碟機上,則傳輸到用戶端電腦記憶體可能會佔用相當多的執行時間。因此,檔案會被複製到本機暫存資料夾,該資料夾的名稱儲存在環境變數 %TEMP%
中。事實證明,簡單的 Convert 命令與過濾 Identify 結果所需的執行時間相同,但透過 -resize 1x1!
將影像大小調整為一個像素可以顯著加快操作速度,而不會過多改變其結果。請注意,我們使用的是 ECHO %TIME%
而不是 TIME /T
,因為後者只會顯示小時和分鐘,而前者會提供到百分之一秒的時間。與 UNIX 命令 shell 不同,沒有直接的方法來測量相對時間,即設定參考點、執行語句,然後評估所需的時間。批次檔中相對時間的計算比較困難,因為批次檔只允許整數運算。可以使用 FOR 命令提取秒數,然後使用 IM 的 fx 運算子執行減法,允許 60 秒的溢出
FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET START=%%c ... some command(s)... FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET STOP=%%c Convert null: -format "%%[fx:(%STOP%-%START%<0.0)?%STOP%-%START%+60.0:%STOP%-%START%]" info: |
for /f "tokens=1-4 delims=:., " %%a in ("%TIME%") do ^ set /a Start100S=1%%a * 360000 + 1%%b * 6000 + 1%%c * 100 + 1%%d - 36610100 |
批次程式設計指南
簡而言之,以下是編寫批次檔時要遵循的規則- 以
SETLOCAL EnableDelayedExpansion
開頭 - 定義一個變數來引用 IM 的 Convert 工具:
SET IMCONV="%PROGRAMFILES%\ImageMagick"
- 當處理多個檔案時,將包含檔案的資料夾設定為目前資料夾通常可以簡化程式碼,例如:
- 透過
%~d1
切換到磁碟機 - 透過
CD %~p1
切換到資料夾
- 透過
- 使用 GnuTools 的 iconv.exe 將文字轉換為 UTF-8,並從檔案中讀取文字。
- 請記住,Convert 和 Montage 會將文字輸出寫入 stderr,而不是 stdout。
- 許多錯誤是由於文件名包含空格引起的,因此請檢查每個批次是否能正確處理此類文件名。
- 不要忘記將每個百分號加倍,例如在設置 JEPG 質量時。
- 不要忘記將字符串中的特殊字符轉義,例如 "^|"。
SET /A
執行的整數計算將任何以零開頭的數字視為八進制,因此請在每個此類數字前面加上“1”。
總結
以上示例證明,簡單的 DOS 批處理文件在與 ImageMagick 提供的可能性相結合時具有驚人的多功能性。事實上,幾乎所有事情都可以通過批處理文件以某種(粗略的)方式完成。一旦你開始以開發 DOS 批處理文件語言時遵循的奇怪方式思考,腳本甚至可以變得相當簡短。儘管如此,除非你對批處理文件語言非常熟悉,否則這幾行代碼可能會花費你數小時的繁瑣實驗。如果你的目標不僅僅是基本的圖像處理任務,那麼建議使用更複雜的腳本語言,因為代碼的開發將變得更簡單、更有條理。Visual Basic 腳本 (VBS)
Microsoft Windows 腳本宿主 (WSH) 的腳本功能比簡單的批處理文件語言更為複雜。WSH 在可以使用不同的 Active Scripting 語言引擎的意義上與語言無關。默認情況下,它會解釋並運行純文本 JScript 文件(Java 腳本)和 VBScript 文件(VisualBasic 腳本)。Windows 腳本宿主默認安裝在 Windows 98 及更高版本中(但是,由於安全問題,它可能已在目標機器上被關閉)。WSH 實現了一個對象模型,該模型公開了一組 COM 接口,允許你訪問系統對象,尤其是文件系統。我們不會在此詳細討論 Windows 腳本宿主,因為其他地方已經做過(並且可能做得更好),而是提供一些實際示例來說明如何解決典型問題。這些示例以 VisualBasic 腳本給出,但 JScript 代碼非常相似,因此如果這是你喜歡的語言,則應該很容易用 JScript 重寫這些示例。與批處理文件一樣,VBScript 可以使用任何編輯器編寫,我再次建議使用 Notepad++ 作為首選編輯器。至於批處理文件,微軟沒有提供專門用於支持 VBScript 開發的 IDE。Microsoft Office 2000 到 2003 中附帶了一個 Microsoft 腳本編輯器,但我從未嘗試過。微軟還提供了(非常簡陋的)Microsoft 腳本調試器,但同樣,我對它沒有太多個人經驗。有幾種商業 VBS IDE 以合理價格作為共享軟件提供,例如 VbsEdit。正如在 在 Windows 下安裝 ImageMagick 部分中所述,我們在下面通常不會使用 ImageMagick 的 COM+ 接口。IM 的工具(例如 Convert、Montage 和 Identify)將通過調用 shell 的 run 命令直接運行,並帶有所需的所有選項和文件名,這與在批處理文件中完成的方式非常相似。然而,在組裝命令字符串時,我們將利用真正編程語言提供的功能。基本範例:鏡頭校正
由於使用 WSH 會產生一些額外負擔,我們的起始範例並非過於基礎,以便展示 VBScript 與簡單批次檔相比的優勢。在下文中,我們將使用 IM 的桶狀變形來校正 Nikon 995 數位相機的鏡頭失真。校正參數取決於焦距,首先透過magick identify
查詢。對於 Nikon 995 鏡頭的校正,我們只需要參數b(即a, c = 0),可以透過以下公式從焦距f計算得出:b = 0.000005142 f ³ - 0.000380839 f ² + 0.009606325 f - 0.075316854 這種依賴關係是透過lensfun 資料庫找到的,該資料庫列出了此鏡頭的桶狀變形參數。所以以下是我們的 VBScript
SetLocale(1033) ' US, i.e. decimal point const strConv = "IMCONV" ' name of the IM Convert program const strAdd = "_pt" ' string attached to the filename ' Dim wsh Set wsh = CreateObject("Wscript.Shell") ' ' names of the in- and output files strFileIn = WScript.Arguments(0) Pos = InStrRev(strFileIn,".") strFileOut = Left(strFileIn,Pos - 1) & strAdd & Mid(strFileIn, Pos) ' ' evaluation of the focal length and calculation of parameter b command = "identify -format ""%[EXIF:FocalLength]"" """ & strFileIn & """" Set objExec = wsh.Exec(command) strf = objExec.StdOut.Readline f = eval(strf) b = 0.000005142 * f * f * f -0.000380839 * f * f + 0.009606325 * f -0.075316854 ' Command = strConv & " """ & strFileIn _ & """ -virtual-pixel black -filter point -distort Barrel ""0.0 " _ & b & " 0.0 "" """ & strFileOut & """" wsh.run command,7,true |
Shell
物件才能透過其Exec
或Run
方法啟動 IM 的程式。唯一的腳本參數是一個檔案名稱,我們通常透過拖放或傳送到提供。在命名輸出檔案時,我們會在原始檔案名稱後面附加「_pt」,就像 PTlens 那樣,例如Photo.JPG → Photo_pt.JPG。檔案名稱儲存在strFileIn
中,我們從中衍生出輸出檔案的名稱strFileOut
。然後我們執行 IM 的 Identify 程式。結果(即表示焦距的 EXIF 有理數)儲存在strf
中。EXIF 有理數以分子/分母的形式提供,例如 82 / 10 = 8.2 mm。因此,在使用公式計算參數b之前,必須先評估有理數。在最後兩行中,我們構建 Convert 命令列並透過 Shell 物件的 Run 方法執行語句。參數 7 會最小化視窗,而 TRUE 會告知腳本等待結果。以上腳本概述了將 VBScript 與 IM 的命令列工具(而不是 COM+ 物件)一起使用時的總體策略。這些被稱為- 透過 Shell 物件的 Run 命令,如果預計沒有文字輸出
- 透過 Shell 物件的 Exec 命令,如果必須評估文字輸出,就像 Identify 的典型情況一樣。
SETLOCAL EnableDelayedExpansion FOR /F %%i in ('identify -format "%%[EXIF:FocalLength]" %1') DO SET FL=%%i FOR /F %%i IN ('Convert null: -format "%%[fx:0.000005142*(%FL%)^3 - 0.000380839 * (%FL%)^2 + 0.009606325 * %FL% - 0.075316854]" info:') DO SET B=%%i Convert %1 -distort barrel "0.0 !B! 0.0" "%~dpn1_pt%~x1" |
處理多個檔案
與 DOS 批次檔相比,VBScript 的一個真正優勢是您可以輕鬆地迴圈處理任意數量的命令列參數。例如,您可以在 Windows 檔案總管中選取多個檔案,並透過 IM 的 Montage 將選定的影像組合成索引列印。基本程式碼為
Dim wsh Set wsh = CreateObject("Wscript.Shell") ' strInputFiles = "" For EACH Arg IN WScript.Arguments strInputFiles = strInputFiles & " """ & Arg & """" next ' IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg" Command = "montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " -quality 80% """ & IndexFile & """" wsh.run command, 7, true |
Dim FName() Dim wsh Set wsh = CreateObject("Wscript.Shell") ' NArgs = WScript.Arguments.Count Redim FName(NArgs-1) FOR i = 0 TO NArgs - 1 FName(i) = """" & WScript.Arguments(i) & """" NEXT |
Dim FName()
定義一個動態陣列,然後透過 Redim FName(NArgs-1)
重新調整其大小。Montage 的命令列可能會變得非常長,因為在輸入檔案清單中,每個檔案都是以其完整的檔案名稱命名的。最大長度「不是」通常的 8192 個字元,而是由 ShellExecute 函數呼叫所允許的最大長度決定,在 Windows XP 中僅為 2048 個字元。當目錄名稱很長時,可能會導致問題。腳本「無法」處理導致的錯誤,因為錯誤發生在腳本執行「之前」。一種可能的解決方案是將檔案放在名稱較短的本機資料夾中。基於腳本的(部分)解決方案與批次檔的解決方案相同:如果只給定一個檔案名稱,則處理父目錄中的所有影像。為了處理資料夾中的所有 GIF,我們可以執行以下操作:
Dim fs, folder Set fs = CreateObject("Scripting.FileSystemObject") If WScript.Arguments.Count <> 1 Then WScript.Quit(1) set Folder = fs.getFolder(fs.GetParentFoldername(WScript.Arguments(0))) FN="" FOR EACH file in folder.files If instr(file,"gif") <> 0 THEN FN = FN & File & vbLF NEXT MsgBox FN |
for i = 0 to NArgs - 1 for j = i + 1 to NArgs - 1 if FName(i) > FName(j) then Temp = FName(i) FName(i) = FName(j) FName(j) = Temp end if next next |
![[剪輯]](../img_photos/clip.jpg)
處理文字檔
在用戶端電腦上使用腳本時,輸入資訊通常透過拖放或傳送到提供,即基本上由腳本以預定義方式處理的檔案名稱組成。任何其他資訊都必須透過執行時的使用者互動提供,或以文字檔的形式提供。基本上,我們有以下選項- 腳本接受影像檔作為輸入,並附帶一個(可能是可選的)文字檔,提供其他資訊。
- 腳本接受單個文字檔作為輸入,該文字檔列出了要處理的影像以及所需的任何其他資訊。
ordering.txt
的文字檔,如果存在,它將控制幀的排序
strTxtFile="ordering.txt" PDir = fs.getParentFolderName(FName(0)) & "\" Wsh.CurrentDirectory = PDir If fs.FileExists(strTxtFile) then Set objFile = fs.OpenTextFile(strTxtFile, 1) bCtrlFile = True NCols = objFile.ReadLine objFile.close else bCtrlFile = False end if |
![[clip]](../img_photos/wm.jpg)
管道
到目前為止,我們已經通過 Shell 對象的 Run 或 Exec 函數直接調用了 IM 的命令列工具(如 Convert、Identify、Montage)。 但是,如果我們想使用 IM 的管道功能,即用前一個命令的輸出為下一個命令提供輸入,我們必須通過命令環境調用命令列工具。 例如,如果我們想要修剪上面腳本生成的索引打印件的白邊,則代碼必須為
Dim wsh Set wsh = CreateObject("Wscript.Shell") ' strInputFiles = "" For EACH Arg IN WScript.Arguments strInputFiles = strInputFiles & " """ & Arg & """" next ' IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg" Command = "cmd /c montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " miff:- | magick - -trim """ & IndexFile & """" wsh.run command, 7, true |
測試與除錯 VBScript
基本上,我們正在使用 VBScript 為 IM 的命令列工具構造參數列表,然後這些工具將自行運行或在 DOS 框中運行。 這意味著首先您應該確保- 命令列本身按預期工作
- 命令列是由腳本正確構造的。
MsgBox(strCommand)
將文字字串顯示在訊息方塊中,因為如果命令列本身有誤,任何偵錯工具都無法發揮作用。簡單的訊息方塊在偵錯腳本時也很有幫助,我從未真正覺得需要複雜的偵錯工具。考慮到執行階段測試,您應該確保- 可以正確存取 IM 的命令列工具
- 使用者已選取您預期他/她選取的內容,即多個檔案(可能屬於特定類型)、目錄、文字檔案等。
MsgBox(...)
輕鬆顯示錯誤訊息。更多資訊
不幸的是,除了本教學之外,沒有其他已知的教學專門介紹如何在 DOS 批次檔中使用 ImageMagick 命令。網站 DOS "For" 命令說明 網頁有關於使用「FOR
」命令的更詳細說明。您也可以參考 Bonzo 的 批次腳本 頁面。