如何使用 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 像素画布
?
添加几根线条
现在我们有了一张画布,让我们绘制一些标记来显示沿着标尺的不同点。72 ppi(像素/每英寸)是基于 Web 的图形的标准,因此让我们将我们的第一个标记设置为 72 像素并使它从图像底部扩展 30 像素。另外,让我们用黑色填充这个线条,并为其指定两个端点。
?
清单 2. 将一根线条添加到这张画布
convert -fill black -draw "line 72,70 72,100" ruler1.gif ruler2.gif
?
图 2 展示了我们的新图像,图像上面绘制了一条线。
图 2. 带有一根垂直线的画布,线条距画布左边 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 位置 —— 左侧边缘 —— 放置了一个标记。现在,图 3 看起来更像一个标尺了。
?
图 3. 从左边缘起每 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"
?
注意,我们添加了两个参数,以便用户可以更改标尺的名称并指定其长度。现在,我们的标尺看起来就像图 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:=