【发布时间】:2017-05-20 21:16:34
【问题描述】:
【问题讨论】:
-
我发现 xmgrace (en.wikipedia.org/wiki/Grace_%28plotting_tool%29) 对这类事情有好处。我会使用 xmgrace 创建带有刻度线的起始图像并将该图像导入 ImageMagick。
标签: image imagemagick
【问题讨论】:
标签: image imagemagick
你可以做这样的事情。它只是实际代码的一半,因为我已将其逻辑展开并将其注释为块以便于理解:
#!/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 之前添加以下几行,您将获得标签:
# 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
【讨论】:
【讨论】: