答案 0 :(得分:3)
你可以这样做。它只是它看起来的实际代码的一半,因为我已将其逻辑分散并将其注释为块以便于遵循:
#!/bin/bash
WIDTH=480 # Canvas width
HEIGHT=120 # Canvas height
TL=10 # Tick length
# Draw ticks using a loop across width of ruler
for ((i=0;i<$WIDTH;i+=10)); do
# Decide tick length, doubling length if multiple of 100
r=$TL
[[ $((i%100)) -eq 0 ]] && ((r=2*r))
# Draw ticks along top edge of ruler
echo line $i,0 $i,$r
# Draw ticks along bottom edge of ruler
echo line $i,$HEIGHT $i,$((HEIGHT-r))
done | convert -size ${WIDTH}x${HEIGHT} xc:yellow -draw @- result.png
脚本中的for
循环正在生成如下所示的绘图命令,并将它们传递到最后的单convert
命令中,由于-draw @-
,它从标准输入读取它们
line 0,0 0,20
line 0,120 0,100
line 10,0 10,10
line 10,120 10,110
line 20,0 20,10
line 20,120 20,110
line 30,0 30,10
line 30,120 30,110
我没有整天尝试编号标签的定位,但如果您在文件底部的done
之前添加以下几行,您将获得标签:< / p>
# Add numbering labels
if [ $((i%100)) -eq 0 ]; then
echo text $i,$((HEIGHT/2)) \"$i\"
fi
关于垂直方向的滴答,有几种方法可以做到这一点,越来越多地依赖bash
特征 - 例如复合语句等。为了简单起见,我可能会从上面的原始部分拍摄图像并重新加载它以绘制垂直线然后重新保存。它看起来像这样:
#!/bin/bash
WIDTH=480 # Canvas width
HEIGHT=120 # Canvas height
TL=10 # Tick length
# Draw ticks using a loop across width of ruler
for ((i=0;i<$WIDTH;i+=10)); do
# Decide tick length, doubling length if multiple of 100
r=$TL
[[ $((i%100)) -eq 0 ]] && ((r=2*r))
# Draw ticks along top edge of ruler
echo line $i,0 $i,$r
# Draw ticks along bottom edge of ruler
echo line $i,$HEIGHT $i,$((HEIGHT-r))
# Add numbering labels
if [ $((i%100)) -eq 0 ]; then
echo text $i,$((HEIGHT/2)) \"$i\"
fi
done | convert -size ${WIDTH}x${HEIGHT} xc:yellow -draw @- result.png
### NEW PART FOR VERTICAL EDGES FOLLOWS
# Draw ticks down sides of ruler
for ((i=10;i<$((HEIGHT-10));i+=10)); do
# Decide tick length, doubling length if multiple of 100
r=$TL
[[ $((i%100)) -eq 0 ]] && ((r=2*r))
# Draw ticks along left edge of ruler
echo line 0,$i $r,$i
# Draw ticks along right edge of ruler
echo line $((WIDTH-r)),$i $WIDTH,$i
done | convert result.png -draw @- result.png
此版本中的其他一些改进:
#!/bin/bash
WIDTH=730 # Canvas width
HEIGHT=310 # Canvas height
TL=10 # Tick length
# Draw ticks using a loop across width of ruler
for ((i=0;i<$WIDTH;i+=10)); do
# Decide tick length, doubling length if multiple of 100
r=$TL
[[ $((i%50)) -eq 0 ]] && ((r=3*TL/2))
[[ $((i%100)) -eq 0 ]] && ((r=2*TL))
# Draw ticks along top edge of ruler
echo line $i,0 $i,$r
# Draw ticks along bottom edge of ruler
echo line $i,$HEIGHT $i,$((HEIGHT-r))
# Add numbering labels
if [ $((i%100)) -eq 0 ]; then
echo text $i,$((HEIGHT/8)) \"$i\"
echo text $i,$((7*HEIGHT/8)) \"$i\"
fi
done | convert -size ${WIDTH}x${HEIGHT} xc:yellow -draw @- result.png
# Draw ticks down sides of ruler
for ((i=10;i<$((HEIGHT-10));i+=10)); do
# Decide tick length, doubling length if multiple of 100
r=$TL
[[ $((i%50)) -eq 0 ]] && ((r=3*TL/2))
[[ $((i%100)) -eq 0 ]] && ((r=2*TL))
# Draw ticks along left edge of ruler
echo line 0,$i $r,$i
# Draw ticks along right edge of ruler
echo line $((WIDTH-r)),$i $WIDTH,$i
# Add numbering labels
if [ $((i%100)) -eq 0 ]; then
echo text 40,$i \"$i\"
echo text $((WIDTH-80)),$i \"$i\"
fi
done | convert result.png -draw @- result.png
答案 1 :(得分:2)