Board logo

标题: 从命令行创建像素标尺(2) [打印本页]

作者: look_w    时间: 2018-6-14 17:54     标题: 从命令行创建像素标尺(2)

添加文本引用脚本编写的一个要点是要知道何时需要引号,何时不需要,以及如何将引用的字符串作为参数传递。特别需要注意这些脚本中使用的引号。

现在,让我们将标尺上的较大的标记的标签设置为数字 0、72、144...,依次类推。我们需要告知 ImageMagick 使用哪种字体,字体的大小和颜色是什么。显然,数字 0 应该在标尺的左边缘位置,但是如果我们将那些两位数和三位数的数字放置在那些 72 像素点,它们看起来会不平衡。为了更正这个问题,我们需要将它们向左侧稍微偏移一些,使它们正好位于标记的正上方。放大的脚本如清单 5 所示。
清单 5. 向标尺添加标签
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/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. 创建一个标题并测量其大小
1
2
3
4
$ 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 图像类确定字体信息
1
2
3
$ 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. 最终脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/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. 带有标题的最终标尺对于那些没有艺术技巧的人来说,这算得上一种不错的方法。
作者: 思海    时间: 2018-6-15 09:31

佛山思海网络  十八年优质运营商
佛山联通G口大带宽常年优惠促销!
品质服务器托管、租用大特惠!
稳定流畅 24*7售后技术在线
欢迎咨询QQ:983054746




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0