2017-05-20 7 views
0

Kann ich in ImageMagick ein weißes PNG-Rechteck erstellen, das an jeder Kante ein Pixellineal hat? Z.B. alle 50 Pixel ist eine Zeile und der Text? Oder zumindest eine Linie.Erstellen Png-Rechteck mit Linealen entlang Kanten?

Art wie:

enter image description here

Aber so, dass ich von beliebiger Größe erstellen kann.

+0

Ich finde, dass xmgrace (https: // en.wikipedia.org/wiki/Grace_%28plotting_tool%29) ist gut für solche Dinge. Ich würde xmgrace verwenden, um ein Startbild mit den Häkchen zu erstellen und dieses Image in ImageMagick zu importieren. –

Antwort

3

Sie so etwas tun könnte. Es ist nur die Hälfte eigentliche Code, es zu sein scheint, weil ich es logisch ausgebreitet haben und kommentiert sie in Blöcke, um es einfach zu folgen:

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

Die for Schleife im Skript erzeugt Befehle wie die folgende Zeichnung und in den einzelnen convert Befehl am Ende vorbei, die wegen der ich nicht über sie von der Standardeingabe liest -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 

ein ll Tag mit der Positionierung der Nummerierung Etiketten zu experimentieren, aber wenn Sie die folgenden zwei Zeilen in kurz vor den done am Ende der Datei hinzufügen, erhalten Sie Etiketten:

# Add numbering labels 
if [ $((i%100)) -eq 0 ]; then 
    echo text $i,$((HEIGHT/2)) \"$i\" 
fi 

enter image description here


Was die Ticks auf den vertikalen Seiten betrifft, gibt es eine Reihe von Möglichkeiten, dies zu tun, die sich zunehmend auf bash Features verlassen - wie zusammengesetzte Anweisungen und dergleichen. Um es einfach zu halten, würde ich wahrscheinlich das Bild vom ursprünglichen Teil oben nehmen und es neu laden, um die vertikalen Linien zu zeichnen und dann wieder zu speichern. Es würde wie folgt aussehen:

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


Einige weitere Verfeinerungen in dieser Version:

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

+0

Das sieht perfekt aus! Wie erweitere ich es um vertikale Messungen? – theonlygusti

+1

Sehr schöne Mark. Um die linke und rechte Seite zu erhalten, können Sie auch einfach das Bild drehen und den gleichen Code für den oberen und unteren Rand verwenden. Dann dreh dich zurück. Die Beschriftungen an den Seiten würden ebenfalls gedreht werden. Ich weiß nicht, ob das ein Problem ist oder nicht. – fmw42

2

Etwas schnell und schmutzig kann mit ImageMagick mit meinem Skript, Grid, wenn Sie ein Unix-ähnliches Betriebssystem ausführen: Linux/Mac OSX/Windows 10 Unix/Windows mit Cygwin). Dies wird ein Raster mit 10 Abstand schaffen

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

+0

Was ist das Skript "Grid" – theonlygusti

+0

, die nicht für mich existiert – theonlygusti

+0

Sie können Gitter von meinen Skripten unter http://www.fmwconcepts.com/imagemagick/index.html – fmw42

Verwandte Themen