如何使用 Bash 腳本、shell 算法和 ImageMagick 在圖像上繪制線條和文本
?
學(xué)習(xí)如何使用 Linux? 命令行和一些基本的 Bash 腳本編寫(xiě)技巧,以便使用 ImageMagick 在圖像上繪制線條和文本,并同時(shí)創(chuàng)建一個(gè)像素標(biāo)尺。
?
有時(shí),我需要在一張圖像或一塊空白畫(huà)布上繪制幾根線條和一些文本。就在最近,我需要將一個(gè)像素標(biāo)尺的一張簡(jiǎn)單圖像包含在我的一篇 developerWorks 文章中。我希望這張圖像寬 572 像素,以滿足目前 developerWorks 文章圖像的推薦標(biāo)準(zhǔn),就像在 “ developerWorks 投稿圖片處理 ” 中描述的一樣。Linux 和 Windows 有許多屏幕像素標(biāo)尺可用(見(jiàn) 參考資料 ),但我只想要一個(gè)簡(jiǎn)單的 GIF、JPEG 或 PNG 圖像。本文介紹如何使用 Bash 腳本、shell 算法和 ImageMagick 創(chuàng)建一個(gè)像素標(biāo)尺。
?
制作一張畫(huà)布
藝術(shù)家需要的首要裝備就是一張畫(huà)布,因此讓我們使用 XC 假想類(lèi)型在 ImageMagick 中創(chuàng)建一張畫(huà)布。我們還需要一種顏色,可以是 ImageMagick 中的眾多已命名顏色中的一種,也可以是一種自定義顏色。(從
參考資料
獲取到 ImageMagick 文檔的鏈接,這些文檔包含一個(gè)假想類(lèi)型和顏色名稱(chēng)的完整列表)。清單 1 展示如何使用
convert
命令制作一張淺藍(lán)色的 572x100 畫(huà)布。(
convert
命令通常用于轉(zhuǎn)換到一種不同的圖像格式,或者以另一種方式改變一張圖像)。
?
清單 1. 創(chuàng)建一張畫(huà)布
convert -size 572x100 xc:lightblue ruler1.gif
?
圖 1 展示了我們的新畫(huà)布。
圖 1. 用于標(biāo)尺的天藍(lán)色 572x100 像素畫(huà)布
?
添加幾根線條
現(xiàn)在我們有了一張畫(huà)布,讓我們繪制一些標(biāo)記來(lái)顯示沿著標(biāo)尺的不同點(diǎn)。72 ppi(像素/每英寸)是基于 Web 的圖形的標(biāo)準(zhǔn),因此讓我們將我們的第一個(gè)標(biāo)記設(shè)置為 72 像素并使它從圖像底部擴(kuò)展 30 像素。另外,讓我們用黑色填充這個(gè)線條,并為其指定兩個(gè)端點(diǎn)。
?
清單 2. 將一根線條添加到這張畫(huà)布
convert -fill black -draw "line 72,70 72,100" ruler1.gif ruler2.gif
?
圖 2 展示了我們的新圖像,圖像上面繪制了一條線。
圖 2. 帶有一根垂直線的畫(huà)布,線條距畫(huà)布左邊 72 像素
在這個(gè)標(biāo)尺上繪制每個(gè)線條都重復(fù)上述操作,這很乏味,因此讓我們使用
seq
命令來(lái)生成一個(gè)相距 72 像素的水平偏移的列表,同時(shí)使用一個(gè)
for
循環(huán)來(lái)在這個(gè)標(biāo)尺上繪制主線條(如清單 3 所示)。
?
清單 3. 在畫(huà)布上每隔 72 像素添加一條線
convert -fill black -draw "$(for n in $(seq 0 72 572) ;\ do echo line $n,70 $n,100 ; done)" ruler1.gif ruler3.gif
?
注意,我們使用了兩個(gè)命令替代來(lái)為繪制操作生成單獨(dú)的線條規(guī)范。我們還在 0 位置 —— 左側(cè)邊緣 —— 放置了一個(gè)標(biāo)記。現(xiàn)在,圖 3 看起來(lái)更像一個(gè)標(biāo)尺了。
?
圖 3. 從左邊緣起每 72 像素一條垂直線的畫(huà)布
?
對(duì)更多線條編寫(xiě)腳本
此時(shí),我們的命令行變得有點(diǎn)復(fù)雜了,但是我們的標(biāo)尺上仍然只有主要標(biāo)記。現(xiàn)在是時(shí)候編寫(xiě)腳本了。在清單 4 中,我們使用 shell 算法和
for
循環(huán)在已經(jīng)有的標(biāo)記的中間放置一個(gè) 20 像素的標(biāo)記,并在這些較長(zhǎng)的標(biāo)記之間每隔 6 像素放置一些 10 像素的標(biāo)記。為完成本文的任務(wù),我們將調(diào)用腳本
buildruler.sh
并將它放置在我們的工作目錄中。
?
清單 4. 將一個(gè)完整的標(biāo)記集添加到這個(gè)標(biāo)尺
#!/bin/bash # Take user parameters or set defaults rulername="$1" rulerlength="$2" rulername="${rulername:=ruler.gif}" rulerlength="${rulerlength:=572}" drawstring="" #Build the line definitions for the ruler marks for x1 in `seq 0 72 $rulerlength`; do drawstring="$drawstring line $x1,70 $x1,100" for x2 in 0 36; do (( offset = $x1 + $x2 )) drawstring="$drawstring line $offset,80 $offset,100" for x3 in `seq 6 6 30`; do (( offset2 = $offset + $x3 )) drawstring="$drawstring line $offset2,90 $offset2,100" done done done #Create the ruler convert -size "${rulerlength}x100" xc:lightblue -fill black \ -draw "$drawstring" "$rulername"
?
注意,我們添加了兩個(gè)參數(shù),以便用戶可以更改標(biāo)尺的名稱(chēng)并指定其長(zhǎng)度。現(xiàn)在,我們的標(biāo)尺看起來(lái)就像圖 4 一樣。這個(gè)標(biāo)尺是使用命令
./buildruler.sh?ruler4.gif
生成的。
?
圖 4. 帶有完整的標(biāo)記集的標(biāo)尺,標(biāo)記之間相距 6 像素
?
添加文本
現(xiàn) 在,讓我們將標(biāo)尺上的較大的標(biāo)記的標(biāo)簽設(shè)置為數(shù)字 0、72、144...,依次類(lèi)推。我們需要告知 ImageMagick 使用哪種字體,字體的大小和顏色是什么。顯然,數(shù)字 0 應(yīng)該在標(biāo)尺的左邊緣位置,但是如果我們將那些兩位數(shù)和三位數(shù)的數(shù)字放置在那些 72 像素點(diǎn),它們看起來(lái)會(huì)不平衡。為了更正這個(gè)問(wèn)題,我們需要將它們向左側(cè)稍微偏移一些,使它們正好位于標(biāo)記的正上方。放大的腳本如清單 5 所示。
?
清單 5. 向標(biāo)尺添加標(biāo)簽
#!/bin/bash # Take user parameters or set defaults rulername="$1" rulerlength="$2" rulername="${rulername:=ruler.gif}" rulerlength="${rulerlength:=572}" drawstring="" #Build the line definitions for the ruler marks for x1 in `seq 0 72 $rulerlength`; do drawstring="$drawstring line $x1,70 $x1,100" for x2 in 0 36; do (( offset = $x1 + $x2 )) drawstring="$drawstring line $offset,80 $offset,100" for x3 in `seq 6 6 30`; do (( offset2 = $offset + $x3 )) drawstring="$drawstring line $offset2,90 $offset2,100" done done done #Add the labels labelfont="-fill black -font helvetica -pointsize 24 -draw" labelstring="text 0,60 \"0\" " for x1 in 72; do (( offset = $x1 - 12 )) labelstring="$labelstring text $offset,60 \"$x1\" " done for x1 in `seq 144 72 $rulerlength`; do (( offset = $x1 - 18 )) labelstring="$labelstring text $offset,60 \"$x1\" " done #Create the ruler convert -size "${rulerlength}x100" xc:lightblue -fill black \ -draw "$drawstring" $labelfont "$labelstring" "$rulername"
?
現(xiàn)在,我們的標(biāo)尺如圖 5 所示。
?
圖 5. 帶有完整標(biāo)記集和標(biāo)簽的標(biāo)尺
?
定位文本
那么,我們?nèi)绾沃牢谋緫?yīng)該偏移多少,應(yīng)該放置在距離頂部多遠(yuǎn)的位置?想當(dāng)然的答案可能是:試驗(yàn)和猜測(cè),但這不是一個(gè)好辦法。
?
為了更好地放置文本,我們需要知道包含文本的方框有多大。但這取決于字體,字體是否成比例,以及其他一些不容易計(jì)算的因素。幸運(yùn)的是,我們可以以同樣的方法使用 ImageMagick 創(chuàng)建一個(gè)畫(huà)布,我們還能創(chuàng)建一個(gè)
label
。我們將創(chuàng)建一個(gè)標(biāo)題
Pixel Ruler
并將它設(shè)置為 36 點(diǎn)的字體。這個(gè)標(biāo)簽作為一個(gè)圖像創(chuàng)建,我們可以使用
identify
命令來(lái)確定其大小(如清單 6 所示)。
?
清單 6. 創(chuàng)建一個(gè)標(biāo)題并測(cè)量其大小
$ convert -fill NavyBlue -background Lavender -font helvetica -pointsize 36 \ label:"Pixel Ruler" label.gif $ identify "label.gif" label.gif GIF 175x36 175x36+0+0 8-bit PseudoClass 256c 1.98kb
?
我將文本設(shè)置為海軍藍(lán)并添加一個(gè)淡紫色的背景顏色,以便這個(gè)圖像從這個(gè)頁(yè)面背景中凸顯出來(lái)。但是,不管是否使用背景顏色,得到的圖像的大小都相同。生成的標(biāo)簽圖像如圖 6 所示。
?
圖 6. 標(biāo)簽圖像
比編寫(xiě)一個(gè)文件甚至更好的是,我們可以使用 ImageMagick INFO 類(lèi)確定關(guān)于文本的更多信息,比如基線的位置。我們將文本寫(xiě)到一張足夠大的畫(huà)布上,然后沿著文本的邊緣修剪畫(huà)布(如清單 7 所示)。
?
清單 7. 使用 INFO 圖像類(lèi)確定字體信息
$ convert -size 572x100 xc:lightblue -font helvetica -pointsize 36 \ -fill black -undercolor lavender -annotate +40+50 'Pixel Ruler' -trim info: xc:lightblue XC 174x36 572x100+40+23 16-bit DirectClass
?
注解 的文本從一個(gè)點(diǎn)開(kāi)始,該點(diǎn)的 y 坐標(biāo)軸代表文本的基線。上面的輸出顯示,文本填充到一個(gè)大小為 174x36 像素的方框中。這個(gè)結(jié)果和此前的結(jié)果之間存在 1 個(gè)像素的差距,但這并不重要。方框的頂部距離原始畫(huà)布的頂部 23 像素。由于基線位于原始畫(huà)布頂端下方 50 像素處,這意味著基線實(shí)際上距離文本頂端 27 像素(50 減去 23),為下行線留出了 9 個(gè)像素。圖 7 將一個(gè)圖像放置在未修剪的畫(huà)布上來(lái)說(shuō)明這種關(guān)系。
?
圖 7. 標(biāo)簽度量
現(xiàn)在我們已經(jīng)知道了這個(gè)標(biāo)簽的尺寸,讓我們將基線放置在距離圖像頂部 40 像素的位置并使其水平居中。我們的最終腳本如清單 8 所示并可供 下載 。
?
清單 8. 最終腳本
#!/bin/bash # Take user parameters or set defaults rulername="$1" rulerlength="$2" rulername="${rulername:=ruler.gif}" rulerlength="${rulerlength:=572}" drawstring="" #Build the line definitions for the ruler marks for x1 in `seq 0 72 $rulerlength`; do drawstring="$drawstring line $x1,70 $x1,100" for x2 in 0 36; do (( offset = $x1 + $x2 )) drawstring="$drawstring line $offset,80 $offset,100" for x3 in `seq 6 6 30`; do (( offset2 = $offset + $x3 )) drawstring="$drawstring line $offset2,90 $offset2,100" done done done #Add the labels labelfont="-fill black -font helvetica -pointsize 24 -draw" labelstring="text 0,60 '0' " for x3 in 72; do offset3=$(($x3 - 12 )) labelstring="$labelstring text $offset3,60 '$x3' " done for x4 in `seq 144 72 $rulerlength`; do offset4=$(( $x4 - 18 )) labelstring="$labelstring text $offset4,60 '$x4' " done #Add a title titledimension=$(convert -size 572x100 xc:lightblue -font helvetica \ -pointsize 36 -fill black -undercolor lavender\ -annotate +40+50 'Pixel Ruler' -trim info: | awk ' {print $3 } ') titlewidth=${titledimension%x*} titlefont="-fill NavyBlue -font helvetica -pointsize 36" titlepos=$(( (($rulerlength - $titlewidth)) / 2 )) titletext="text $titlepos,30 'Pixel Ruler' " #Create the ruler convert -size "${rulerlength}x100" xc:lightblue \ -fill black -draw "$drawstring" $labelfont "$labelstring" \ $titlefont -draw "$titletext" "$rulername"
?
最終的標(biāo)尺如圖 8 所示。
?
圖 8. 帶有標(biāo)題的最終標(biāo)尺
對(duì)于那些沒(méi)有藝術(shù)技巧的人來(lái)說(shuō),這算得上一種不錯(cuò)的方法。
?
一個(gè)實(shí)踐示例
如果圖像被縮進(jìn) — 比如在列表中 — developerWorks 上允許的最大寬度就相應(yīng)減小。因此,您可以使用這些方便的標(biāo)尺來(lái)檢查隨文章一起提交的圖像。
-
這是在一個(gè)未排序的列表中的一個(gè)短標(biāo)尺,它使用
./buildruler.sh?ruler9.gif?400
命令創(chuàng)建。圖 9. 一個(gè) 400 像素標(biāo)尺
?
結(jié)束語(yǔ)
通過(guò)本文的簡(jiǎn)單實(shí)踐,您看到了使用 ImageMagick 通過(guò)腳本編寫(xiě)包含線條和文本的圖像的一些基本技巧。您將在我們的文章 “ 通過(guò)命令行處理圖形 -- 使用 ImageMagick 進(jìn)行翻轉(zhuǎn)、縮放大小、旋轉(zhuǎn)以及更多操作 ” 和 “ 通過(guò)命令行進(jìn)一步處理圖形 -- 在 Linux 上使用 ImageMagick 的提示與技巧 ” 中發(fā)現(xiàn)更多技巧。您也可以在 ImageMagick 的主頁(yè)上找到更多示例,從 參考資料 部分獲取相關(guān)鏈接。
?
本 文中的腳本并不是無(wú)懈可擊的。例如,對(duì)于長(zhǎng)度是不是對(duì)一個(gè)有意義的標(biāo)尺足夠大的正數(shù)值,或者指定的文件是不是 ImageMagick 的有效圖像文件類(lèi)型,我們沒(méi)有進(jìn)行驗(yàn)證。您可能還會(huì)發(fā)現(xiàn)其他問(wèn)題。例如,標(biāo)尺標(biāo)簽可能像圖 10 中那樣被截?cái)啵@是我們的腳本沒(méi)有考慮的一個(gè)問(wèn)題。
?
您還可以任意添加多個(gè)參數(shù),例如,嘗試添加顏色或標(biāo)尺高度參數(shù)。
?
盡管這個(gè)技巧主要關(guān)注在 Linux 上使用 ImageMagick,ImageMagick 也可用于 Windows 等其他平臺(tái)上。嘗試在您喜歡的平臺(tái)上使用腳本工具實(shí)踐這些技巧。
?
參考資料
學(xué)習(xí)
- “ developerWorks 投稿圖片處理 ”(developerWorks,2008 年 7 月)展示如何為 developerWorks 文章和教程制作和提交技術(shù)圖形。
- “ 通過(guò)命令行處理圖形 -- 使用 ImageMagick 進(jìn)行翻轉(zhuǎn)、縮放大小、旋轉(zhuǎn)以及更多操作 ”(developerWorks,2003 年 7 月)和 “ 通過(guò)命令行進(jìn)一步處理圖形 -- 在 Linux 上使用 ImageMagick 的提示與技巧 ”(developerWorks,2004 年 3 月)展示從命令行使用 ImageMagick 的其他技巧。
- 在 ImageMagick Web 站點(diǎn) 查找手冊(cè)頁(yè)和 ImageMagick 用途的多個(gè)示例。
- 在 可愛(ài)的 Python:將 XML 和 Python 結(jié)合起來(lái)介紹 Python 的 XML 工具 可以找到更多針對(duì) Linux 開(kāi)發(fā)人員的參考資料。
- 在 developerWorks Linux 專(zhuān)區(qū) 尋找為 Linux 開(kāi)發(fā)人員(包括 Linux 新手入門(mén) )準(zhǔn)備的更多參考資料,查閱我們 最受歡迎的文章和教程 。
- 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程 。
- 隨時(shí)關(guān)注 developerWorks 技術(shù)活動(dòng) 和 網(wǎng)絡(luò)廣播 。
獲得產(chǎn)品和技術(shù)
-
一些屏幕標(biāo)尺可用于不同的操作系統(tǒng):
- Gnome Screen Ruler (Linux Gnome) 可能包含在您的 Linux 發(fā)行版中。
- KRuler (Linux KDE) 是 KDE 圖形包的一部分,可能包含在您的 Linux 發(fā)行版中。
- Free ruler (Mac OS X) 是針對(duì) Mac 的一個(gè)免費(fèi)屏幕標(biāo)尺。
- JR Screen Ruler (Windows) 是針對(duì) Windows 的一個(gè)免費(fèi)虛擬標(biāo)尺。
- 使用可以直接從 developerWorks 下載的 IBM 產(chǎn)品評(píng)估試用版軟件 ,在 Linux 上構(gòu)建您的下一個(gè)項(xiàng)目。
討論
- 加入 My developerWorks 社區(qū) ;您可以通過(guò)個(gè)人信息和定 制主頁(yè)獲得符合自己的興趣的 developerWorks 文章,并 與其他 developerWorks 用戶進(jìn)行交流。
來(lái)源: http://www.ibm.com/developerworks/cn/linux/l-pixelruler/index.html
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
