Gabi und Sascha
Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Ich muss ermitteln wie breit die Abstände vom Inhalt eines Bildes zum Rand sind. Eines ziemlich einfachen Bildes. Dies allerdings nicht für 1 Bild sondern für ein paar tausend Bilder. Bei solchen Aufgaben helfen Photoshop und Gimp nur bedingt weiter. Aber zum Glück gibt es das Schweizer Taschenmesser für Grafikbearbeitung: imagemagick.

Die Bilder sehen alle ungefähr wie das Folgende aus:


640 % 400

Allerdings habe ich bei imagemagick auch keine Bordmittel gefunden wie die Rahmenbreite ermittelt werden kann. Deswegen musste ich einen Umweg gehen.

Zuerst wird das Bild so zugeschnitten, dass nur der innere Bereich erhaten bleibt. Mittels des -trim Kommandos kann der Rahmen weggeschnitten werden. Dabei schneidet imagemagick alles weg was nicht den Farben der 4 Eckpunkten entspricht.


    convert "two black elipses.png" -trim "two black elipses (trimmed).png"

Das Ergebnis sieht so aus:


299 x 177

Mit dem Wissen um den -trim Befehl kann jetzt die Breite des linken Randes bestimmt werden. Damit der rechte Rand nicht ebenfalls weggeschnitten wird, wird in das Originalbild genommen und dort ein schwarzer Strich gezeichnet, gefolgt von einem weiteren weissen Strich. Das neue Bild wird unter einem eigenen Namen abgelegt:


    convert "two black elipses.png" \
            -gravity East           \
            -background black       \
            -splice 1x0             \
            -background white       \
            -splice 1x0             \
            "two black elipses (helper).png"

    convert "two black elipses (helper).png" \
            -trim "two black elipses (helper, trimmed).png"

Von dem trimmed Bild muss jetzt die Breite ermittelt werden. Für spätere Berechnungen wird der Wert gleich in einer Variablen gespeichert:


    W=$(convert "two black elipses (helper, trimmed).png" -format "%w" info: )

Um die Breite des linken Rahmens zu berechnen, muss noch die Breite des Originalbildes ermittelt werden. Auch dieser Wert wird gleich in einer Variable gespeichert. Ebenfalls benötigt wird noch die Breite des trimmed original Bildes.


    TOTAL_WIDTH=$(convert "two black elipses.png" -format "%w" info: )
    TRIMMED_WIDTH=$(convert "two black elipses (trimmed).png" -format "%w" info: )

Mittels Subtraktion kann jetzt die jeweilige Rahmenbreite Links und Rechts berechnet werden:


    BORDER_LEFT_WIDTH=$(expr ${TOTAL_WIDTH) - ${W})
    BORDER_RIGHT_WIDTH=$(expr ${TOTAL_WIDTH} - ${BORDER_RIGHT_WIDTH} - ${TRIMMED_WIDTH})

Die Berechnung der oberen und unteren Rahmenhöhe ist ensprechend:


    TRIMMED_HEIGHT=$(convert "two black elipses (trimmed).png" -format "%h" info: )

    convert "two black elipses.png" \
            -gravity South          \
            -background black       \
            -splice 0x1             \
            -background white       \
            -splice 0x1             \
            "two black elipses (helper).png"

    convert "two black elipses (helper).png" \
            -trim "two black elipses (helper, trimmed).png"

    H=$(convert "two black elipses (helper, trimmed).png" -format "%h" info: )
    TOTAL_HEIGHT=$(convert "two black elipses.png" -format "%h" info: )
    BORDER_TOP_HEIGHT=$(expr ${TOTAL_HEIGHT} - ${H})
    BORDER_BOTTOM_HEIGHT=$(expr ${TOTAL_HEIGHT} - ${BORDER_TOP_HEIGHT} - ${TRIMMED_HEIGHT})

Ergebnis:

border top height 119
border bottom height 104
border left width 167
border right width 174

Download Bash Script der kompletten Umsetzung.