用边缘的标尺创建png矩形?

时间:2017-05-20 21:16:35

标签: image imagemagick

我可以在ImageMagick中创建一个白色PNG矩形,每个边缘都有一个像素标尺吗?例如。每50个像素是一行和文字?或者至少一行。

有点像:

enter image description here

但是我可以创建任意大小。

2 个答案:

答案 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

enter image description here

脚本中的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

enter image description here

关于垂直方向的滴答,有几种方法可以做到这一点,越来越多地依赖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

enter image description here

此版本中的其他一些改进:

#!/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

enter image description here

答案 1 :(得分:2)

如果您运行类似Unix的操作系统,可以使用我的脚本网格使用ImageMagick进行快速和脏的操作:Linux / Mac OSX / Windows 10 unix / Windows w / Cygwin。这将创建一个间距为10的网格。

convert -size 499x149 xc:white miff:- | grid -s 10 -d 9 - grid.png 

enter image description here

convert grid.png \( -size 481x131 xc:white \) -gravity center -compose over -composite ruler.png

enter image description here