需要批次大量修圖時， ImageMagick 超好用。 命令列麻瓜/新手/小學生請跟著我做， 勇敢踏出滑鼠選單便利但局促的保護傘， 感受一下 「用電腦」 跟 「被電腦用」 的差別。
我們從 這六張可愛狗狗圖片 出發。 現實生活中， 當你面對 60 張或 600 張圖片時， 今天學的這幾招會更有感覺； 不過在教室裡面， 老師們總是習慣拿小小數量的資料來解說 :-) 我們的目標是要把這六張圖片都變成大小相同的圖片， 並從 exif 後設資料 (meta data) 當中撈字串出來， 把它寫到相片上。請先用 geeqie 檢視相片。 等一下每次產生新圖片時， geeqie 會自動更新、 可以點新圖片來看， 不必重新執行。
安裝套件： apt-get install imagemagick 這裡面包含本文要用到的 identify、 convert、 montage 三個指令。
再學迴圈跟變數： for x in earth mars venus ; do echo "hello people from $x !" ; done 注意： 單引號跟雙引號大部分時候效果一樣； 但這裡就不一樣。 這裡必須用雙引號， 裡面的變數才會代換。
convert 指令的 -crop 功能可以剪裁圖片： convert -crop 960x800+240+0 3.jpg test.jpg 位置及大小的寫法是 「寬度x高度+左緣+上緣」， 原點在左上角。
convert 指令的 -resize 功能可以改變圖片解析度： convert -resize 480 3.jpg test.jpg 或 convert -resize x400 3.jpg test.jpg 。 第一句指定寬度， 它自動算高度； 第二句指定高度， 它自動算寬度。 我都不會同時指定寬度與高度； 讓 ImageMagick 根據原圖的寬高比例 (aspect ratio) 來自動幫我計算另一個值， 比較簡單。
先把相片變成同樣大小。 因為 ImageMagick 有些特效的範圍是用 pixel 數指定的， 如果圖片大小不一的話， 在大圖上， 特效可能很不明顯， 而在小圖上， 效果可能太誇張。
但是統一規格不能直接 resize -- 如剛剛所說， 有些圖片可能會變太胖， 有些變太瘦。 我們先印出所有圖片的解析度： identify ?.jpg 出現類似這樣：
好， 現在知道 2.jpg 最窄高； 3.jpg 跟 5.jpg 最矮胖。 目標是把所有圖片的 aspect ratio 調成 4:3 。 調整 aspect ratio 很難批次處理， 最多只能分成幾大類各類處理。
第一步先把 2.jpg 的上下各砍掉一點： convert -crop 500x375+0+64 2.jpg test.jpg 如果從 geeqie 裡面看起來 ok， 再 mv test.jpg 2.jpg 。 這件事當然也可以用 gimp 做； 不過我覺得下指令還是比較快一點。
再來， 1.jpg 3.jpg 4.jpg 5.jpg 分別要保留中間、 左邊、 左邊、 中間偏右； 另兩張直接拷貝：
先手動測試在圖片上貼字： convert -font AR-PL-UKai-TW -pointsize 24 -stroke '#0008' -undercolor '#ffc8' -gravity South -annotate +0+5 '馬麻什麼時候回來啊?' 1.jpg test.jpg 這麼長的指令當然不是我自己一口氣寫出來的， 而是上網 爬文、 一點一點蓋出來的。 簡單說明：
字型的部分， 因為要寫中文， 所以不能用預設值， 一定要指定。 根據 這個問答， 可先用 convert -list font 查詢有哪些字型可用。 我在 lubuntu 上面有安裝 fonts-arphic-ukai 跟 fonts-arphic-uming 兩個套件， 所以有 AR-PL-UKai-TW 跟 AR-PL-UMing-TW 可用。
絞盡腦汁想台詞這種工作， 也是要逐張用工人智慧手工打造的。 不過一貼到圖裡面去， 再要還原或修改， 那就更複雜了。 所以較理想的方式是用 digikam 相片整理軟體 或是用 exiftool 命令列工具 把文字存在 jpg 檔裡面的 IPTC/IIF/XMP/EXIF 欄位， 然後再用指令產生如上的貼字指令。 這就是 「保留原始碼好做事」 的概念。
exiftool 的 -p 選項可以直接想寫什麼就寫什麼； 不過更多時候， 我會先用各種蒐集資訊的指令印出一個對照表， 再用 regexp 把對照表轉成想下的指令。 以下在最新的 crop/ 子目錄下執行：
原先單句實驗時， 顏色字串外面用單引號， 像這樣： '#0008' 但是現在 perl -ne '...' 也要用單引號， 所以只好把顏色字串改成雙引號。 那 perl 本身的 print 呢? 還好 perl 可以用 qq(...) 代表雙引號。
ImageMagick 還有超多特效可用， 請見 官網。 這個網站 拿 IM 組合出很多驚豔的效果， 可惜他們的作品並不是自由軟體。
以下是一些不錯的 IM 中文教學：
在命令列上要批次處理大量的檔案， 通常有兩個方法： 如果只是單純一堆檔名， 可以用 for 迴圈； 如果每個檔名還會搭配不同的參數， 那可能用 regexp 產生命令會比較方便。
下指令就像蓋房子一樣， 第一眼直接看到完整的指令， 可能會覺得很雄偉很可敬； 但其實就只是一點一點搭起來的而已。 指令並不可怕， 也不要覺得剪貼指令很不上進。 我就經常剪貼。 只要剪貼時勇敢地這裡改一點、 那裡改一點， 就會有收穫、 有感覺。 當資料量很大時， 下指令 vs 滑鼠選單的差別就很明顯了。 命令列控們堅持我們要用電腦， 不要被電腦用。
各種文字格式的檔案， 永遠是命令列控最好的朋友。 下指令時， regexp 很少是主角， 但經常是很重要的配角。 各種文字檔案處理工具也是。 學命令列就像玩積木一樣， 重點在於發揮組合的力量， 而不在於誰擁有哪一塊獨特、 稀有、 昂貴的積木。