亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux 技巧: 從命令行創建像素標尺

系統 2007 0

如何使用 Bash 腳本、shell 算法和 ImageMagick 在圖像上繪制線條和文本

?

學習如何使用 Linux? 命令行和一些基本的 Bash 腳本編寫技巧,以便使用 ImageMagick 在圖像上繪制線條和文本,并同時創建一個像素標尺。

?

有時,我需要在一張圖像或一塊空白畫布上繪制幾根線條和一些文本。就在最近,我需要將一個像素標尺的一張簡單圖像包含在我的一篇 developerWorks 文章中。我希望這張圖像寬 572 像素,以滿足目前 developerWorks 文章圖像的推薦標準,就像在 “ developerWorks 投稿圖片處理 ” 中描述的一樣。Linux 和 Windows 有許多屏幕像素標尺可用(見 參考資料 ),但我只想要一個簡單的 GIF、JPEG 或 PNG 圖像。本文介紹如何使用 Bash 腳本、shell 算法和 ImageMagick 創建一個像素標尺。

?

制作一張畫布

藝術家需要的首要裝備就是一張畫布,因此讓我們使用 XC 假想類型在 ImageMagick 中創建一張畫布。我們還需要一種顏色,可以是 ImageMagick 中的眾多已命名顏色中的一種,也可以是一種自定義顏色。(從 參考資料 獲取到 ImageMagick 文檔的鏈接,這些文檔包含一個假想類型和顏色名稱的完整列表)。清單 1 展示如何使用 convert 命令制作一張淺藍色的 572x100 畫布。( convert 命令通常用于轉換到一種不同的圖像格式,或者以另一種方式改變一張圖像)。

?
清單 1. 創建一張畫布
      convert -size 572x100 xc:lightblue ruler1.gif
    

?

圖 1 展示了我們的新畫布。

圖 1. 用于標尺的天藍色 572x100 像素畫布

用于標尺的天藍色 572x100 像素畫布

?

添加幾根線條

現在我們有了一張畫布,讓我們繪制一些標記來顯示沿著標尺的不同點。72 ppi(像素/每英寸)是基于 Web 的圖形的標準,因此讓我們將我們的第一個標記設置為 72 像素并使它從圖像底部擴展 30 像素。另外,讓我們用黑色填充這個線條,并為其指定兩個端點。

?
清單 2. 將一根線條添加到這張畫布
      convert  -fill black -draw "line 72,70 72,100" ruler1.gif ruler2.gif
    

?

圖 2 展示了我們的新圖像,圖像上面繪制了一條線。

圖 2. 帶有一根垂直線的畫布,線條距畫布左邊 72 像素

帶有一根垂直線的畫布,線條距畫布左邊 72 像素

在這個標尺上繪制每個線條都重復上述操作,這很乏味,因此讓我們使用 seq 命令來生成一個相距 72 像素的水平偏移的列表,同時使用一個 for 循環來在這個標尺上繪制主線條(如清單 3 所示)。

?
清單 3. 在畫布上每隔 72 像素添加一條線
      convert  -fill black -draw "$(for n in $(seq 0 72 572) ;\
 do echo line $n,70 $n,100 ; done)" ruler1.gif ruler3.gif
    

?

注意,我們使用了兩個命令替代來為繪制操作生成單獨的線條規范。我們還在 0 位置 —— 左側邊緣 —— 放置了一個標記?,F在,圖 3 看起來更像一個標尺了。

?
圖 3. 從左邊緣起每 72 像素一條垂直線的畫布

從左邊緣起每 72 像素一條垂直線的畫布

?

對更多線條編寫腳本

此時,我們的命令行變得有點復雜了,但是我們的標尺上仍然只有主要標記。現在是時候編寫腳本了。在清單 4 中,我們使用 shell 算法和 for 循環在已經有的標記的中間放置一個 20 像素的標記,并在這些較長的標記之間每隔 6 像素放置一些 10 像素的標記。為完成本文的任務,我們將調用腳本 buildruler.sh 并將它放置在我們的工作目錄中。

?
清單 4. 將一個完整的標記集添加到這個標尺
      #!/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"
    

?

注意,我們添加了兩個參數,以便用戶可以更改標尺的名稱并指定其長度?,F在,我們的標尺看起來就像圖 4 一樣。這個標尺是使用命令 ./buildruler.sh?ruler4.gif 生成的。

?
圖 4. 帶有完整的標記集的標尺,標記之間相距 6 像素

?

添加文本

引用

腳本編寫的一個要點是要知道何時需要引號,何時不需要,以及如何將引用的字符串作為參數傳遞。特別需要注意這些腳本中使用的引號。

現 在,讓我們將標尺上的較大的標記的標簽設置為數字 0、72、144...,依次類推。我們需要告知 ImageMagick 使用哪種字體,字體的大小和顏色是什么。顯然,數字 0 應該在標尺的左邊緣位置,但是如果我們將那些兩位數和三位數的數字放置在那些 72 像素點,它們看起來會不平衡。為了更正這個問題,我們需要將它們向左側稍微偏移一些,使它們正好位于標記的正上方。放大的腳本如清單 5 所示。

?
清單 5. 向標尺添加標簽
      #!/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"
    

?

現在,我們的標尺如圖 5 所示。

?
圖 5. 帶有完整標記集和標簽的標尺

帶有一個完整標記集和標簽的標尺

?

定位文本

那么,我們如何知道文本應該偏移多少,應該放置在距離頂部多遠的位置?想當然的答案可能是:試驗和猜測,但這不是一個好辦法。

?

為了更好地放置文本,我們需要知道包含文本的方框有多大。但這取決于字體,字體是否成比例,以及其他一些不容易計算的因素。幸運的是,我們可以以同樣的方法使用 ImageMagick 創建一個畫布,我們還能創建一個 label 。我們將創建一個標題 Pixel Ruler 并將它設置為 36 點的字體。這個標簽作為一個圖像創建,我們可以使用 identify 命令來確定其大小(如清單 6 所示)。

?
清單 6. 創建一個標題并測量其大小
      $ 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
    

?

我將文本設置為海軍藍并添加一個淡紫色的背景顏色,以便這個圖像從這個頁面背景中凸顯出來。但是,不管是否使用背景顏色,得到的圖像的大小都相同。生成的標簽圖像如圖 6 所示。

?

圖 6. 標簽圖像

標簽圖像

比編寫一個文件甚至更好的是,我們可以使用 ImageMagick INFO 類確定關于文本的更多信息,比如基線的位置。我們將文本寫到一張足夠大的畫布上,然后沿著文本的邊緣修剪畫布(如清單 7 所示)。

?
清單 7. 使用 INFO 圖像類確定字體信息
      $ 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
    

?

注解 的文本從一個點開始,該點的 y 坐標軸代表文本的基線。上面的輸出顯示,文本填充到一個大小為 174x36 像素的方框中。這個結果和此前的結果之間存在 1 個像素的差距,但這并不重要。方框的頂部距離原始畫布的頂部 23 像素。由于基線位于原始畫布頂端下方 50 像素處,這意味著基線實際上距離文本頂端 27 像素(50 減去 23),為下行線留出了 9 個像素。圖 7 將一個圖像放置在未修剪的畫布上來說明這種關系。

?
圖 7. 標簽度量

標簽度量

現在我們已經知道了這個標簽的尺寸,讓我們將基線放置在距離圖像頂部 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"
    

?

最終的標尺如圖 8 所示。

?
圖 8. 帶有標題的最終標尺

帶有標題的最終標尺

對于那些沒有藝術技巧的人來說,這算得上一種不錯的方法。

?

一個實踐示例

如果圖像被縮進 — 比如在列表中 — developerWorks 上允許的最大寬度就相應減小。因此,您可以使用這些方便的標尺來檢查隨文章一起提交的圖像。

  • 這是在一個未排序的列表中的一個短標尺,它使用 ./buildruler.sh?ruler9.gif?400 命令創建。
    圖 9. 一個 400 像素標尺
    一個 400 像素標尺
    • 這是一個進一步縮進的更短的標尺,它使用 ./buildruler.sh?ruler10.gif?300 命令創建。
      圖 10. 一個 300 像素標尺
      一個 300 像素標尺

?

結束語

通過本文的簡單實踐,您看到了使用 ImageMagick 通過腳本編寫包含線條和文本的圖像的一些基本技巧。您將在我們的文章 “ 通過命令行處理圖形 -- 使用 ImageMagick 進行翻轉、縮放大小、旋轉以及更多操作 ” 和 “ 通過命令行進一步處理圖形 -- 在 Linux 上使用 ImageMagick 的提示與技巧 ” 中發現更多技巧。您也可以在 ImageMagick 的主頁上找到更多示例,從 參考資料 部分獲取相關鏈接。

?

本 文中的腳本并不是無懈可擊的。例如,對于長度是不是對一個有意義的標尺足夠大的正數值,或者指定的文件是不是 ImageMagick 的有效圖像文件類型,我們沒有進行驗證。您可能還會發現其他問題。例如,標尺標簽可能像圖 10 中那樣被截斷,這是我們的腳本沒有考慮的一個問題。

?

您還可以任意添加多個參數,例如,嘗試添加顏色或標尺高度參數。

?

盡管這個技巧主要關注在 Linux 上使用 ImageMagick,ImageMagick 也可用于 Windows 等其他平臺上。嘗試在您喜歡的平臺上使用腳本工具實踐這些技巧。

?

參考資料

學習

獲得產品和技術

討論

  • 加入 My developerWorks 社區 ;您可以通過個人信息和定 制主頁獲得符合自己的興趣的 developerWorks 文章,并 與其他 developerWorks 用戶進行交流。

來源: http://www.ibm.com/developerworks/cn/linux/l-pixelruler/index.html

?

Linux 技巧: 從命令行創建像素標尺


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色国产在线视频一区 | 天天操夜夜添 | 国产精品成人免费综合 | 色久阁 | 欧美精品一区二区在线观看 | 免费观看a黄一级视频 | 欧洲亚洲精品 | 男人在线网站 | 亚洲成av人片天堂网 | 亚洲国产日产韩国欧美综合 | 国产精品久久久久毛片 | 亚洲欧美日韩精品高清 | 亚洲日韩精品欧美一区二区一 | 激情奇米 | 国产一区二区福利久久 | 国产dvd毛片在线视频 | 久久久久久综合七次郎 | 奇米影视奇奇米色狠狠色777 | 久久777国产线看观看精品卜 | 97在线亚洲| 男人的天堂免费在线观看 | 91精品自在拍精选久久 | 亚洲 欧美 日韩 在线 | 国产日产欧美一区二区三区 | 亚洲欧美专区 | 视频一区二区三区在线观看 | 久久久不卡国产精品一区二区 | 国产亚洲第一精品社区麻豆 | 欧美日韩三区 | 中文字幕在线观看亚洲日韩 | 九九热精品免费 | 老司机深夜福利网站 | 亚洲永久精品一区二区三区 | 欧美v在线| 亚洲图片 中文字幕 | 亚洲综合网站久久久 | 日韩久久精品视频 | 四虎视频在线 | 国产理论视频在线观看 | 国产精品亚洲精品观看不卡 | a级做人爱免费播放 |