Aus LinuxUser 06/2011

Bilder verarbeiten mit der Magick Scripting Language

© Bugdog, sxc.hu

Fix und fertig

Die Magic Srcipting Language hilft Ihnen, Bilder mit einem fest definierten Satz an Parametern zu bearbeiten. In Verbindung mit geschickter Shell-Programmierung nutzen Sie so die Ressourcen eines Systems optimal aus.

Als erstes Ergebnis beim Vereinfachen der Arbeit entstand im Teil 1 [1] ein Skript, das alle Parameter zum Verändern als Variablen enthielt. Das funktioniert sehr effizient, und es gelingt sehr leicht, die Modifikationen eindeutig einem ausgewählten Bildformat und Dateimuster zuzuordnen.

Möchten Sie hingegen mehrere Bilder individuell anzupassen, stoßen Sie so recht schnell an Grenzen und müssen sich eine brauchbare Alternative überlegen. In manchen Fällen hilft die Magick Scripting Language (MSL) weiter, und daher verknüpft dieser Workshop die Technik mit den Erkenntnissen aus dem Shell-Skripting aus dem Teil 1.

Serie Automatische Bildverarbeitung

Teil 1: Imagemagick, Graphicsmagick LU 03/2011, S. 84 http://www.linux-community.de/22947
Teil 2: Magick Scripting Language LU 06/2011, S. 84 http://www.linux-community.de/22948

Magische Sprache

MSL gehört zu den Imagemagick- und Graphicsmagick-Paketen. Es handelt sich dabei um einen XML-Dialekt [2] und als solcher folgt er daher den entsprechenden Konventionen. Bei MSL-Dateien handelt es sich um reine Textdateien mit einem Markup. Jeder Texteditor eignet sich zum Bearbeiten, und es existieren zudem Werkzeuge, die die Syntax auf Korrektheit prüfen (siehe Kasten „Validieren einer XML-Datei“).

Validieren einer XML-Datei

Für komplexere XML-Dateien empfiehlt sich in jedem Fall das Überprüfen auf syntaktische Korrektheit. Dazu zählt beispielsweise, ob Sie jedes geöffnete Element in der richtigen Knotenebene wieder geschlossen, alle Attribute korrekt in Anführungszeichen gesetzt haben und ob Kommentare in sich abgeschlossen sind.

Das Standardisierungsgremium für Internetprotokolle W3C bietet dazu auf seiner Webseite [5] die Möglichkeit an, eigene XML-Dateien hochzuladen und sofort auf Korrektheit zu überprüfen. Das Ergebnis sieht dann analog zu Abbildung 1 aus.

Abbildung 1: Ergebnis der W3C-Validierung.
Abbildung 1: Ergebnis der W3C-Validierung.

Auf der Kommandozeile hilft das Werkzeug Xmllint [6]. Es gehört zur Libxml, der XML-Bibliothek aus dem Gnome-Projekt. Für Debian und Ubuntu heißt das dazugehörige Paket Libxml2-utils. Sie verwenden Xmllint folgendermaßen:

$ xmllint --noout --valid bild.xml

Die Option --noout unterdrückt die Ausgabe der XML-Datei auf der Standardausgabe, --valid sorgt für das Überprüfen der angegebenen Datei auf Korrektheit („XML-Konformität“). Gefundene Fehler gibt die Software am Ende auf der Standardausgabe aus.

In einer MSL-Datei legen Sie die Modifikationen fest, die Sie an einer Bilddatei vornehmen möchten. Diese einzelnen Anweisungen führt der Interpreter nacheinander aus. Für jedes Kommando gibt es in MSL ein eigenes Element, oft mit zusätzlichen Attributen. XML-Parser legen die Werte der Elemente und Attribute in einer Baumstruktur ab und haben so die Möglichkeit, die Daten effizient zu verarbeiten. Listing 1 zeigt eine einfache MSL-Datei.

Listing 1

<?xml version="1.0" encoding="UTF-8"?>
<image>
 <read filename="bild.png" />
 <resize geometry="640x480" />
 <write filename="bild-vorschau.png" />
</image>

In Zeile 1 steht der Kopf („Header“) der XML-Datei mit der verwendeten XML-Version (hier: 1.0) und der Bezeichnung für das Codierungsschema, in dem die einzelnen Zeichen in der XML-Datei abgespeichert sind (hier: UTF-8). Die Zeilen 2 und 6 markieren mit den Knoten <image> und </image> den Beginn und das Ende der Informationen zu einer Bilddatei.

Die Zeilen 3 bis 5 enthalten die Anweisungen, die ein Interpreter auf die Bilddatei anwendet. Zunächst erfährt der Konverter in Zeile 3 aus dem Element read mit dem Attribut filename den Name der angegebenen Bilddatei (bild.png) und liest diese ein. Anschließend skaliert er die Bilddaten auf die aus dem Attribut geometry des Elements resize gewonnene Breite (640 Pixel) und eine Höhe (480 Pixel). Das Element write gibt über das Attribut filename Aufschluss darüber, wie die Ausgabedatei heißt (bild-vorschau.png). Falls die angegebene Datei bereits existiert, überschreibt der Konverter diese ohne Vorwarnung mit dem neuen Bildinhalt.

Die MSL-Datei verarbeiten Sie mit dem Werkzeug Conjure (Teil von Imagemagick [3]) oder über die Option conjure von Graphicsmagick [4]. Die Aufrufe sehen für die beiden Werkzeuge wie folgt aus:

$ conjure bild-einfach.xml
$ gm conjure bild-einfach.xml

Beide interpretieren das übergebene MSL-Skript und arbeiten die Anweisungen wunschgemäß ab. Die beiden Programme verhalten sich konform zu traditionellen Unix-Tools – nur bei Fehlern erfolgt eine Nachricht an den Benutzer, ansonsten schweigen beide beharrlich.

Haben Sie mehr als ein einziges Bild zu bearbeiten, legen Sie für jede Bilddatei eine passende MSL-Datei an und erledigen danach mit Conjure das Umwandeln. Von Hand ist das aufwendig. Mit einem Shellskript wie in Listing 2 verkürzen Sie den Aufwand erheblich.

Listing 2

#!/bin/bash
for bilddatei in $(find . -type f -printf '%P\n');
do
        # Name und Dateityp ermitteln und prüfen
        fname=$(basename ${bilddatei})
        dateiname=${fname%.*}
        dateityp=${fname#*.}
        case "$dateityp" in
        png|PNG)
                msl_datei="${bilddatei%.*}.xml"
                echo "Lege an: ${msl_datei} für ${bilddatei}"
                cat > ${msl_datei} << EOF
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="${fname}" />
<resize geometry="200x200" />
<write filename="${dateiname}-vorschau.png" />
</image>
EOF
                # Bild transformieren
                gm conjure "$msl_datei"
        esac
done

Das Skript analysiert zuerst den Inhalt des aktuellen Verzeichnisses und merkt sich alle Dateien in einer Liste (Zeile 2). In der For-Schleife überprüft es jeden Eintrag mittels File, ob es sich dabei um eine Bilddatei mit der passenden Dateiendung handelt (Zeile 9). Für jede PNG-Datei aus der Liste generiert es eine passende MSL-Datei und speichert diese ab (Zeilen 11 bis 20). In Zeile 11 setzt es den vollständigen Name der MSL-Datei aus dem Namen der Bilddatei und dem Suffix .xml zusammen.

LinuxUser 06/2011 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: