(命令列的) 圖片整形術


請將這些圖片另存新檔, 並取一個比較短的名字: gnu-tux, star-trek, snoopy, kanzi, sunrise, garden。 先看一下所有的圖: xli *.jpg 用 xli 看多張圖片時, 按 n 或空間棒進入下一頁; p 回到上一頁。 如果圖太大, 可以縮小顯示, 例如: xli -zoom 25 gnu-tux.jpg star-trek.jpg 以 25% 的大小顯示。 然後試試以下指令, 並觀察變換前及變換後的圖片:

	convert -spread 3 garden.jpg a.jpg
	convert -emboss 3 kanzi.jpg a.jpg
	convert -modulate 100,20 star-trek.jpg a.jpg
	convert -charcoal 3 gnu-tux.jpg a.jpg
	convert -paint 3 snoopy.jpg a.jpg
	convert -annotate 0x0+4+26 '日出' -font /usr/share/fonts/truetype/arphic/ukai.ttc -pointsize 24 sunrise.jpg a.jpg

如果只有兩三個圖檔要處理, 或每個圖檔要做不同的處理必須逐一手工修飾, 其實圖形介面的 gimp 或許更合你用。 但若要一次處理多個檔案呢? 這就是命列列厲害的地方了。

	echo hello	# 照印, 蠻無聊的指令
	for s in hello how are you ; do echo $s ; done	# 迴圈
	for f in *.jpg ; do echo $f ; done	# 印出所有 .jpg 檔名
	mkdir emboss
	for f in *.jpg ; do echo convert -emboss 3 $f emboss/$f ; done
	for f in *.jpg ; do convert -emboss 3 $f emboss/$f ; done

另一個方法是用 regular expressions 把每個檔名都改成提及此檔名的指令, 再交由 bash 執行:

	ls *.jpg
	ls *.jpg | perl -pe 's#(.*)#convert -emboss 3 $1 emboss/$1#'
	ls *.jpg | perl -pe 's#(.*)#convert -emboss 3 $1 emboss/$1#' | bash

平常我們用程式產生資料; 這裡卻是用資料產生程式。 靜下來想想這個例子怪異的地方, 再發揮你的想像力, 想像如果我們產生的指令不是 convert, 而是 ???, 你就知道為什麼有些人堅持要用命令列了。 重複性, 機械化的動作, 就不該是人做的。 用滑鼠選單來做, 並沒有比較高明

ImageMagick 也有 Windows 版。 更多功能詳見 官方網站 (左側 "Command-Line Tools" 等文件連結)。 更多應用實例:

  1. More graphics from the command line
  2. 5 ImageMagick command line examples part 2