photomappe.de

Python-Fu Scripte als Batch ausführen

Getestet mit Gimp 2.6 auf Linux.

gimp-console - Gimp ohne Fenster

Unter Linux wird mit Gimp auch das Programm gimp-console installiert. Dieses Programm verhält sich als ob Gimp mit dem Parameter -i oder --no-interface gestartet wurde.

Wenn das Konsolen-Gimp ohne Parameter gestartet wird bleibt es ohne weitere Ausgaben in der Shell stehen und muss mit Ctrl+C abgebrochen werden:

    $ gimp-console-2.6
    ^Cgimp-console-2.6: terminated: Interrupt
    /usr/lib64/gimp/2.0/plug-ins/script-fu terminated: Interrupt
    $
    

Der Batch-Interpreter

Mit dem Parameter -b oder --batch kann Gimp (und gimp-console) ein Kommando zur Ausführung übergeben werden. Dieser Parameter kann auch mehrfach angegeben werden.

Ein mit -b übergebenes Kommando wird an den Script-Fu Interpreter zur Ausführung weitergeben. Hier muss also die Syntax von Scheme eingehalten werden.

Ein einfaches Beispiel wäre das Kommando zum Beenden von Gimp:

    gimp-console-2.6 -b "(gimp-quit 0)"
    

Dieses Kommando läuft ohne eine Rückmeldung durch zum Eingabeprompt der Shell.

Ein Python-Batch

Um ein Python-Fu Script im Batch-Modus laufen zu lassen muss also ein Scheme-Kommando wie im Script-Fu Procedure-Browser beschrieben an Gimp übergeben werden. Dieses Kommando muss den Namen der Funktion, den Run-Mode und die Parameter enthalten. Falls man die Gimp-Instanz dann nicht mehr benötigt kann man dann noch ein Quit-Kommando anhängen.

Ein Beispiel-Script

Um die Vorgehensweise bei der Batchausführung zu demonstrieren gibt es hier ein einfaches Python-Fu-Script: Es nimmt eine Engabe entgegen und gibt sie als Text in ein Bild aus. Das Bild wird unter /tmp/img1.jpg gespeichert.

    #!/bin/env python
    # -*- coding: utf-8 -*-

    from gimpfu import *

    def batch_function(text):
        workimg = pdb.gimp_image_new(1024, 768, RGB)
        layer = pdb.gimp_text_layer_new(workimg, text, "", 74, 0)
        pdb.gimp_image_add_layer(workimg, layer, -1)
        pdb.gimp_text_layer_set_color(layer, (128,128,128))
        pdb.gimp_image_resize_to_layers(workimg)
        pdb.gimp_image_merge_visible_layers(workimg, EXPAND_AS_NECESSARY)
        drawable = pdb.gimp_image_get_active_drawable(workimg)
        targetf = "/tmp/img1.jpg"
        pdb.file_jpeg_save(workimg, drawable, targetf, targetf, .9, 0, 1, 0, "created with gimp-python", 0, 1, 0, 1)

    register(
        "python_batch2",
        "Text mit Funktionsbeschreibung des Plug-In.",
        "Weitere Beschreibung für den Plug-In-Browser (Additional information)",
        "Author Name, Adresse...",
        "Copyright-Hinweise",
        "Datumsangabe",
        "/File/Create/batch 2",
        "",
        [
            (PF_STRING, "text", "Beschreibung des Eingabewertes", "42"),
        ],
        [],
        batch_function)

    main()

    # eof
    

Das Script gibt es hier als Download.

Diese Datei wird im Plugin-Verzeichnis von Gimp abgelegt (unter Linux z.B. ~/gimp-2.6/plug-ins/, der Dateiname kann beliebig gewählt werden).

Nach dem Neustart von Gimp taucht das Plug-In unter Datei - Erstellen - batch2 (File - Create - batch2) auf und kann interaktiv aufgerufen werden. Es stellt folgenden Dialog dar:

Das Fenster
    der Script-Fu Konsole

Batch-Aufruf von Python-Fu

Jetzt muss für den Batch-Aufruf ein Scheme-Kommando erstellt werden. Dazu ermittelt man die nötigen Parameter über den Procedure-Browser von Gimp:

Das Fenster
    der Script-Fu Konsole

Das Shell-Kommando setzt sich aus dem Procedure-Namen und den Parametern, hier einem String, zusammen. Scheme fasst ein Kommando mit seinen Parametern in runde Klammern ein.

    gimp-console-2.6 -b '(python-batch2 RUN-NONINTERACTIVE "hallo welt")' -b "(gimp-quit 0)"
    

Das Kommando sollte mit batch command executed successfully quittiert werden. Falls nicht hilft ein Ausprobieren des Kommandos in Script-Fu (wie hier beschrieben).

Escaping

Da es sich um ein Scheme-Kommando in einer Shell handelt muss man das Escapen von Sonderzeichen der beteiligten Systeme beachten.

Scheme benötigt die Runden Klammern für seine Kommandos. Sollte man nun einen Parameter mit einer öffnenden Runden Klammer benötigen (z.B. einen Farbwert), so muss man das wie folgt angeben:

    gimp-console-2.6 -b "(py-fu-func RUN-NONINTERACTIVE \"String-Par\" 1234 '(255 255 255))"
    

Die öffnende Klammer muss mit einem einfachen Anführungszeichen versehen werden.