Tutonaut
script-fu-header

Batch-Verarbeitung mit Gimp im Terminal – Beispiel: Cropping

Stapelverarbeitung läuft bei Gimp über Script-Fu. Am Beispiel Cropping zeigen wir, wie Ihr simples Batch-Beschneiden realisiert und dies als Vorlage nutzt.

Manche Aufgaben in Gimp sind für alle Bilder gleich – da macht es keinen Sinn, das Prozedere für jedes Bild einzeln durchzuführen. Für die Stapelverarbeitung gibt es mehrere Möglichkeiten, die Standardvariante geht über die Kommandozeile. Als Beispiel seht Ihr hier, wie Ihr alle Bilder eines Ordners mit Zealous Crop automatisch beschneiden lassen könnt.

Etwas mehr …

Leider macht das Ganze einmalig etwas mehr Arbeit: Gimp kann nicht einfach über etwas wie gimp -batch -zealous-crop *.png aufgerufen werden – leider. Es muss ein Skript her, bei Gimp folglich über das integrierte Script-Fu für Erweiterungen. Das liegt wohl vor allem daran, dass Gimp mehrere Aufgaben ausführen muss: Bild öffnen, aktive Ebene auswählen, beschneiden und dann auch noch speichern, genauer gesagt überschreiben. Zudem muss das Skript dann auch noch korrekt aufgerufen werden.

Im Folgenden erstellt Ihr nun also ein Skript für das Cropping mehrerer Dateien und den Terminal-Befehl für dessen Aufruf. Ihr habt danach aber auch eine Vorlage: Das hier erstellte Beispielskript besteht aus den Bausteinen Dateien öffnen, Datei bearbeiten, Datei speichern – und da Öffnen und Speichern immer gleich ablaufen, könnt Ihr Cropping relativ einfach durch andere Funktionen aus Gimp ersetzen.

Was genau das Zealous Cropping macht, zeigen wir hier im Detail. Kurz: Es schneidet ein Bild auf den eigentlichen Inhalt zu.

1. Skript erstellen

Erstellt zunächst eine Datei namens beispielsweise mein-zealous.scm und speichert sie im Skript-Ordner von Gimp: Unter Linux standardmäßig etwa ~/.gimp-2.8/scripts und unter Windows C:\Users\NUTZERNAME\AppData\Roaming\GIMP\2.10\scripts.

Und hier der Inhalt:

(define (mein-zealous-zeugs pattern )
(let* ((filelist (cadr (file-glob pattern 1))))
(while (not (null? filelist))
(let* ((filename (car filelist))
(image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(drawable (car (gimp-image-get-active-layer image))))
(plug-in-zealouscrop RUN-NONINTERACTIVE image drawable)
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
(gimp-image-delete image))
(set! filelist (cdr filelist)))))

Über define wird zunächst ein Name für die Funktion vergeben. Dann wird die Variable pattern festgelegt, in der von Euch beim Skriptaufruf übergebene Parameter landen.

let heißt jeweils einfach, dass die Variablen für den folgenden (Klammern-)Block gelten.

Zu Beginn wird von filelist die Liste der beim Aufruf des Skripts von Euch übergebenen Dateien geladen. Innerhalb der while-Schleife werden dann die einzelnen Bilder der Liste zunächst per gimp-file-load geladen. Dann wird über gimp-image-get-active-layer die aktive Ebene „geladen“. Die Befehle car, cdr und cadr sprechen die einzelnen Elemente der Dateiliste an. Der Rest ist Syntyx-Beiwerk ;)

Die eigentliche Funktion folgt nun über plug-in-zealouscrop, der drei Parameter übergeben werden: Lauf-Modus, Dateiname und Ebene. Wichtig: Im define-Aufruf in der ersten Zeile wurde hier nur pattern übergeben, da die Zealous-Crop-Funktion selbst keinerlei Parameter benötigt. Wenn Ihr stattdessen etwa jedes Seite manuell um einen gewissen Pixelwert croppen wolltet, müsstet Ihr der entsprechenden Funktion auch mindestens diese vier über den define-Aufruf zur Verfügung stellen (Beispiel folgt im Schritt Andere Funktionen erstellen am Ende).

Nach der Verarbeitung wird über gimp-file-save und gimp-image-delete gespeichert und bereinigt – und letztlich aktualisiert set die Liste und die while-Schleife läuft weiter.

2. Skript aufrufen

Beim Aufruf müsst Ihr zwei Dinge erledigen: Die Dateien übergeben und Gimp nach Erledigung wieder schließen. Ruft das Skript in folgender Art auf:

gimp -i -b '(mein-zealous-zeugs "*.png")' -b '(gimp-quit 0)'

i verhindert die grafische Gimp-Oberfläche und b leitet den Batch-Modus ein. Achtung: Nun wird die Funktion über den definierten Namen mein-zealous-zeugs und nicht über den Dateinamen aufgerufen. Es folgt das Muster für PNG-Dateien, hier einfach im aktuellen Ordner. Das zweite Batch-Kommando schließt Gimp. Es sollten Erfolgsmeldungen für jedes Bild kommen oder Hinweise, dass es nichts zu croppen gab.

Und damit ist Euer Batch-Cropper auch schon fertig. Natürlich ließe sich noch einiges anpassen, beispielsweise das Speichern als Kopie, statt das Bild zu überschreiben, komplexere Muster und so weiter. Aber das Grundgerüst steht – speichert es als Vorlage.

3. Andere Funktionen erstellen

Im Grunde müsst Ihr Euch im obigen Code nur um zwei Zeilen kümmern, um eine ganz andere Funktion umzusetzen. Hier mal aus dem Beispiel der offiziellen Dokumentation nur die unterschiedlichen Zeilen:

(define (simple-unsharp-mask filename radius amount threshold)
...
(plug-in-unsharp-mask RUN-NONINTERACTIVE image drawable radius amount threshold)
...

Wie oben bereits erwähnt, benötigen andere Funktionen mehr Parameter im define-Aufruf, hier eben radius, amount und threshold für die Funktion Unsharp Mask (Unscharf Maskieren). Entsprechend werden die Parameter dann auch im eigentlichen Funktionsaufruf hinter plug-in-unsharp-mask übergeben – die ersten drei Parameter (Lauf-Modus, Dateiname, Ebene) sind wieder dieselben wie beim obigen Zealous-Beispiel.

Der Aufrufe könnte dann entsprechend zum Beispiel

gimp -i -b '(mein-unscharf-zeugs "*.png" 5.0 0.5 0)' -b '(gimp-quit 0)'

lauten.

Ihr findet die verfügbaren Funktionen samt benötigter Parameter im Menü unter Filters/Script-Fu/Console/Browse.

script-fu-browser-screenshot
Funktionen samt Parametern im Script-Fu-Browser.

Für Batch-Skripte müsst Ihr also – nochmals zur Vereinfachung – immer folgende drei Dinge tun:

  1. define-Aufruf Eurer Vorlage mit Namen und Parametern versorgen.
  2. Funktionsaufruf mit Namen und Parametern versorgen.
  3. Skriptaufruf – Ihr ahnt es – mit Namen und Parametern versorgen.

Und schon sieht der ganze Scripting-Wust etwas einfacher aus. Hoffe ich. Klar ist das erst der Anfang, aber wenn Ihr das Grundkonzept jetzt einmal intus habt, ist alles weitere „nur“ die übliche Skriptzusammenbastelei, mehr Fleißarbeit als sonstwas ;)

Mehr zu Gimp haben wir hier, mehr Terminal-Spielereien hier.

Mirco Lang

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler.

Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds.

Wenn ich Dir helfen konnte und/oder Du hier mehr über Open Source, Linux, Bastelkram oder auch Windows-Basics lesen möchtest:
Spendier mir einen Kaffee via Paypal.

Kommentar schreiben

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Do NOT follow this link or you will be banned from the site!