去年我為 developerWorks 寫了一篇關於在命令行中使用 ImageMagick 處理圖像的文章。那篇文章得到了相當好的評價,此後我通過電子郵件收到了很多關於 ImageMagick 的問題。本文是對上一篇文章中討論的技術的擴展,並且回答了那些我力所能及的問題。如果這是您在 IBM DeveloperWorks 發現的第一篇關於 ImageMagick 的文章,那麼您最好先去閱讀其第一篇文章(在 參考資料 部分可以找到它的鏈接)。
本文采用了根據示例來討論特定問題的論述方法,但是那些概念同樣適用於其他問題空間。這個方法和前一篇文章所采用的方法相同。這裡討論到的技術也可以和我們先前討論的那些技術結合到一起使用。
應該注意的是,有很多方法可以完成本文中討論的內容。我將只討論我所使用的方法,並且知道這些方法適合我。這並不是說除此以外其他工具不好,而只是表示我喜歡我現在使用的工具。
圓角
如果您看一看 Mac OS/X,以及很多 Web 站點,那些圖片有非常漂亮的圓角。您怎樣才能用 ImageMagick 實現這一效果?好的,我們將展示一些使用 composite 命令來生成這種效果的靈活方法。
不過,在我們達到目的之前,讓我們先談一下我們將要運用的策略。如果您考慮一下,可以通過將一些標准預制的角疊加到原始圖像上來制作出具有圓角的圖像。甚至不需要是圓的角 —— 我們可以用尖角,或者是更有趣的東西。
記住將角的多余部分設置為透明的。這一透明特性可以讓我們要疊加角的圖像仍可以顯示出來。這可能會讓人有些迷惑,因為有一些圖像浏覽器,比如 xview,將以黑色或者其他顏色來表示透明。
GIMPGIMP,即 GNU Image Manipulation Package,是一個非常有用的光柵圖形編輯器,很像 Adobe Photoshop。它很適於調節圖像,或者創建您自己的新圖片。查看本文的 參考資料 部分以查找關於 Gimp 和 Gimp 參考資料的鏈接。
圖 1. 用 xview 顯示的圓角實際的角圖像被疊加到一個圖像上之後會變得更為清晰,所以讓我們來繼續做下去。我有一張以前在堪培拉的一個湖岸邊拍攝的小圖片。在沒有圓角時,這張小圖片看起來是這樣的:
圖 2. Burley Griffin 湖您可以使用 composite 命令將一個圖像疊加到另一個圖像上。讓我們只疊加一個角,來看看發生了什麼:
composite -gravity NorthEast rounded-ne.png lake.png lake-1.png
其中 gravity 參數定義了在圖像何處放置疊加的圖像 —— 在我們的示例中是圓角。這一特定的命令讓我們得到了下面的圖像:
圖 3. 有一個圓角的 Burley Griffin 湖下面我們再來處理其他的角:
composite -gravity NorthEast rounded-ne.png lake.png lake-1.png composite -gravity NorthWest rounded-nw.png lake-1.png lake-2.png composite -gravity SouthEast rounded-se.png lake-2.png lake-3.png composite -gravity SouthWest rounded-sw.png lake-3.png lake-4.png
這將帶給我們最終的圖像:
圖 4. 圓角的 Burley Griffin 湖依我拙見,這看起來有一些酷。您還應該注意到,這些角圖像不必是圓的。如果您對尖角或者類似的東西感興趣,那些同樣是可能的 —— 只需要在位圖編輯器中改變角的圖像。實際上,您甚至可以用您的徽標取代角來疊加到圖像上。
如果您想使用我的圓角,可以訪問在本文末尾參考資料部分列出的鏈接。
最後,下面是一個小腳本,讓您可以將指定目錄下的所有 png 圖像的角變為圓角:
for img in *.png do composite -gravity NorthEast rounded-ne.png $img.png $img-1.png composite -gravity NorthWest rounded-nw.png $img-1.png $img-2.png composite -gravity SouthEast rounded-se.png $img-2.png $img-3.png composite -gravity SouthWest rounded-sw.png $img-3.png $img-4.png done
更多的請看:http://www.QQread.com/windows/2003/index.Html
為圖像添加邊框
有一些讀者提出的另一個問題是如何給圖像添加邊框。同樣,通過 ImageMagick 可以輕松完成。
凸邊或凹邊
我將要介紹的第一類邊框是凸邊或凹邊。這個效果是通過調節圖像邊緣的顏色而實現的,看起會感覺圖像像是從周圍表面凸起或者凹下。為實現這個效果,您需要指定一個尺寸,首先是水平尺寸,然後是垂直尺寸。這些尺寸的大小必須滿足這樣一個規則,尺寸的二倍必須小於或等於在那個方向上圖像的尺寸大小。例如,您不可以指定邊框垂直尺寸大於圖像垂直尺寸的一半 —— 其實這主要是說您不可以制作一個比原圖還要大的邊框。
使用 -raise 命令行參數來創建凸邊。例如,為創建一個 5 像素乘 5 像素的邊,我們執行:
convert -raise 5x5 tree.png tree-raised.png
這將給出最終的圖像:
圖 5. 帶有凸邊的圖像
只需要將命令行參數換為 +raise 就可以創建一個凹邊。例如:
convert +raise 5x5 tree.png tree-lowered.png
這將得到一個稍有不同的圖像:
圖 6. 帶有凹邊的圖像
一個簡單的純色邊
如果您喜歡稍微簡潔一些的風格,您可能對純色的邊感興趣。ImageMagick 同樣可以為您完成這一任務。
convert -bordercolor red -border 5x5 flower.png flower-border.png
這將創建:
圖 7. 帶有紅邊的圖像
我們可以在命令行中為邊指定哪些顏色?是這樣,這個列表太長了以至於在本文中無法給出。執行下面這個命令可以得到列表的一個拷貝:
convert -list color
從桔黃色到原木色,從玉米色到貝殼白,有 683 種“基本”顏色可以選擇 —— 更不用說您還可以使用以下方法來指定您自己的顏色了,這裡 R 表示紅色值,G 表示綠色值,B 表示藍色值,A 是 alpha(透明度)值:
#RGB - (R,G,B 是十六進制數,每個 4 位) #RRGGBB - (每個 8 位) #RRRGGGBBB - (每個 12 位) #RRRRGGGGBBBB - (每個 16 位) #RGBA - (每個 4 位) #RRGGBBAA - (每個 8 位) #RRRGGGBBBAAA - (每個 12 位) #RRRRGGGGBBBBAAAA - (每個 16 位) rgb(r,g,b) - (r,g,b 是十進制數) rgba(r,g,b,a) - (r,g,b,a 是十進制數)
構建一個更復雜的邊框
接下來讓我們用 -frame 命令行參數構建一個更為復雜的邊框。首先我們將添加一個和前面的示例中構建的邊相同(只是顏色不同)的邊框。
convert -mattecolor black -frame 5x5 beach.png beach-frame.png
用參數 -mattcolor 和 -frame 替換了 -bordercolor 和 -border,不過其余部分與 border 命令相同。
圖 8. 簡單的黑色邊
現在我們可以做一些更復雜的事情,添加一些類似於用 -raise 命令得到的陰影。
convert -mattecolor black -frame 5x5+2 beach.png beach-frame2.png
現在是這樣了:
圖 9. 同一張圖片,不過有一些更多的修飾
最後,我們可以添加一些更多的修飾,以達到我期望的最終效果:
convert -mattecolor black -frame 5x5+2+2 beach.png beach-frame3.png
最後我們得到:
圖 10. 完成的邊框
如果您正在尋找為您的圖像制作漂亮的邊框的方法,那麼我建議您花一些時間來研究 -frame 命令的參數。例如,這裡有一些有趣的邊框,加在了澳大利亞 King’s Canyon 的巖石圖片上。
要深入了解可用的各種不同邊框,請參考 convert 的手冊頁。
convert -mattecolor gray -frame 25x25+0+25 rock.png rock-frame1.png
convert -mattecolor gray -frame 25x25+25+0 rock.png rock-frame2.png
圖 11. 兩個邊框
同時處理多個圖像
在我的上一篇文章中,我已經給出了同時轉換多個圖像的代碼。正如一些人所指出的,我給出的代碼並不是最好的方法。
下面是我以前給出的代碼:
清單 1. 生成當前目錄下所有 JPEG 圖片的縮略圖
for img in `ls *.jpg` do convert -sample 25%x25% $img thumb-$img done
現在已經證明這是不好的 bash 風格,因為它沒有很好地處理文件名中的空格(每個詞將被認為是一個單獨的文件名)。取而代之,一個更好的方法是:
清單 2. 生成當前目錄下所有 JPEG 圖片的縮略圖,具有更好的 bash 風格
for img in *.jpg do convert -sample 25%x25% $img thumb-$img done
更多的請看:http://www.qqread.com/windows/2003/index.html
這將更好地處理文件名中的空格。
不過,結果證明這兩個方案 ImageMagick 都不需要 —— 我們可以只使用 mogrify 命令。 mogrify 命令用於轉換一系列文件(雖然它同樣可以處理單一的圖像)。
前面的代碼片斷將變成:
mogrify -sample 25%x25% *.jpg
注意,這將會導致原始圖像被新圖像所覆蓋。很難指定輸出文件名,這是 mogrify 的局限性之一。 指定輸出文件名的惟一的方法是,改變輸出文件相對於輸入文件的格式。這樣的結果是新的圖像具有了不同的擴展名。例如:
mogrify -format png -sample 25%x25% *.jpg
這將創建一系列輸出文件,這些文件的末尾的 jpg 將由 png 所取代,同時伴隨著文件格式的改變。
前面定義的所有轉換也都可以用 mogrify 命令來完成,所以,如果您不在意原始文件被覆蓋的話,這是一個很好的選擇。如果您不希望原始文件被覆蓋,那麼您可以將它們拷貝到一個臨時目錄來對它們進行轉換(mogrify),並改變它們的名字 —— 或者您繼續使用 convert 和 bash。
PDF 處理
到現在為止我們所討論過的示例(不管是本文的還是前文的),都是針對獨立圖像的簡單轉換。ImageMagick 還可以一次進行不止一個圖像的有趣轉換,值得關注。
最常見的示例是 ImageMagick 的 PDF 處理。讓我們假想一個情形,您給出了一個包含一系列圖像(每頁一個)的 PDF 文件。ImageMagick 將為您導出那些圖像到單獨的文件中。例如,下面是一個 PDF 文檔的屏幕截圖,其中有一些我最近到 Linux.conf.au 旅游的圖片(順便說一句,實在是太美了):
圖 12. 帶有幾個圖像的 PDF 樣例
讓我們假定上面的 PDF 是一個朋友發給您的。您希望將圖像導出以進行進一步的處理。
convert 當然可以將這些圖像從 PDF 文檔中導出:
convert foo.pdf pages.png
這將是我們想要做的 —— 每一頁被導出為自己的 PNG 文件。不過,有一個命名方面的意外的副作用。
清單 3. 檢查文件名
mikal@deathstar:~/foo$ convert foo.pdf pages.png mikal@deathstar:~/foo$ ls pages* pages.png.0 pages.png.1 pages.png.2 pages.png.3 pages.png.4 mikal@deathstar:~/foo$
由於命令創建了不只一個 PNG 文件,所以文件名被附加了一個惟一的編號。如果您接下來嘗試使用基於文件擴展名來判斷文件類型的代碼或者腳本,那麼將會受到影響。
作為一個友好的工具, convert 讓我們可以更好地指定文件名。前面的命令實際上應該是像這樣:
清單 4. 從 PDF 文檔中導出頁,賦以更好的文件名
mikal@deathstar:~/foo$ convert foo.pdf pages-%03d.png mikal@deathstar:~/foo$ ls pages* pages-000.png pages-001.png pages-002.png pages-003.png pages-004.png mikal@deathstar:~/foo$
%03d 是 printf風格的格式說明符。對於這種用法您需要了解的只是 %d代表一個十進制數,而且您還可以通過向序列中插入一個 0<number> 來引入一組前導零。數字指定了顯示的值應該占用的位數。
還應該注意的是,您可以導出包含文本的 PDF 頁。實際上其幕後機制是 ImageMagick 使用 Ghostscript 來呈現頁,然後將其轉換為您所選擇的圖像格式。不過沒有進行光學字符識別 —— 您得到的是位圖。
您還可以用 convert 將多個圖像文件轉換為 PDF。實際上前面的示例中的 PDF 是通過下面這個命令構建的:
convert dsc* foo.pdf
只需要向 convert 傳遞圖像文件的一個列表,並確保最後一個文件名是您要將它們放入的 PDF 文檔的名字。
支持每個文件多個圖像的其他格式
當與 ImageMagick 一起使用時,還有其他 45 種文件格式可以存儲不止一個圖像,本文的 參考資料 部分有一個鏈接指向其完全列表。
所有這些的處理方式都與提到的 PDF 示例相同。其中一些也很有趣。能將 postscript 文件的頁導出為圖像(例如,考慮將您發表的論文作成縮略圖放在您的 Web 站點上),或者能將您剛收到的多頁傳真的所有頁作成一個 TIFF 圖像,這些都是很方便的。
您甚至可以從 MPEG 影片中導出幀,不過那需要更深入地討論,已經不在本文的范圍之內。
結束語
在本文中我們對我的上一篇關於 ImageMagick 的文章中討論的一些有趣的技術進行了進一步描述,包括如何使您的圖像變為圓角(尤其是上一次我們討論的小圖片),給您的圖像添加各種不同的漂亮邊框,以及如何同時處理多幅圖像。最後介紹了如何自多頁格式(的文件)中導出圖像,以及如何構建新的多頁文檔。
如果您正在尋找更多的參考資料,那麼我鼓勵您去訪問本文 參考資料部分中給出的 ImageMagick Web 站點。還有,如果您有什麼問題的話歡迎給我寫信。
非常感謝那些向我提出實際問題的人,是這些問題促成了本文。我還要感謝您的耐心,因為過了很長時間我才回答這些問題。
原文鏈接:http://www-128.ibm.com/developerworks/cn/linux/l-graf2/index.html