使用ImageMagick 的提示与技巧
沒有什么能像命令行工具這樣適合于處理大批量的任務,對于圖像處理也不例外。Web 開發人員和管理員會喜歡輕松處理大量文件的能力,無論是使用命令行還是腳本。程序員 Michael Still 給出了更多關于 ImageMagick 套件的示例,這一次向您示范了如何將圓角、徽標或者邊框和邊添加到您的圖像中,以及如何與多頁文件格式 (包括 Adobe PDF 格式)進行轉換。
圓角
如果您看一看 Mac OS/X,以及很多 Web 站點,那些圖片有非常漂亮的圓角。您怎樣才能用 ImageMagick 實現這一效果?好的,我們將展示一些使用?composite?命令來生成這種效果的靈活方法。
不過,在我們達到目的之前,讓我們先談一下我們將要運用的策略。如果您考慮一下,可以通過將一些標準預制的角疊加到原始圖像上來制作出具有圓角的圖像。甚至不需要是圓的角 —— 我們可以用尖角,或者是更有趣的東西。
記住將角的多余部分設置為透明的。這一透明特性可以讓我們要疊加角的圖像仍可以顯示出來。這可能會讓人有些迷惑,因為有一些圖像瀏覽器,比如?xview,將以黑色或者其他顏色來表示透明。
|
圖 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
為圖像添加邊框
有一些讀者提出的另一個問題是如何給圖像添加邊框。同樣,通過 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` doconvert -sample 25%x25% $img thumb-$img done |
現在已經證明這是不好的 bash 風格,因為它沒有很好地處理文件名中的空格(每個詞將被認為是一個單獨的文件名)。取而代之,一個更好的方法是:
清單 2. 生成當前目錄下所有 JPEG 圖片的縮略圖,具有更好的 bash 風格?
| for img in *.jpg doconvert -sample 25%x25% $img thumb-$img done |
這將更好地處理文件名中的空格。
不過,結果證明這兩個方案 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 影片中導出幀,不過那需要更深入地討論,已經不在本文的范圍之內。
?
轉載于:https://www.cnblogs.com/zhongbin/p/3147651.html
總結
以上是生活随笔為你收集整理的使用ImageMagick 的提示与技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软BI 之SSIS 系列 - 利用 S
- 下一篇: C++控制台读取和输出函数