Batch Scripting Hilfe

Hier bekommst du Hilfestellungen zu GIMP
Antworten
compuscidave
Beiträge: 3
Registriert: Mo 14. Dez 2020, 19:46
Betriebssystem: Ubuntu

Batch Scripting Hilfe

Beitrag von compuscidave »

Moin auch,

ich benutze GIMP schon recht lange und bin auch sehr zufrieden damit. Nun ist es allerdings angebracht das ich etwas Batch Scripting betreibe da ich gerade ein Kartenspiel auf deutsch übersetze und ungern 250 dateien einzeln editieren und Umrandungen zu den Texten hinzufügen möchte.

Ich bin von Beruf Programmierer und ich habe es oft versucht, aber für mich ist das Scripting interface von GIMP sehr obtus... ich steige beim besten Willen einfach nicht durch und habe ehrlich gesagt auch keine Lust mehr :(

Würde deswegen gerne nachfragen ob jemand so nett sein könnte mir das Script wie ich es benötige zusammen zu schreiben. Meist kann ich anhand eines solchen beispiels mich entlanghangeln und selber scripten, aber ich habe bis jetzt nicht den Fuß in die Tür bekommen...

Folgende Situation:

Mehrere Dateien in denen mehrere Layer vorhanden sind. Ein bestimmter Layer mit Text ist in jeder Datei vorhanden und heißt immer gleich.
Zu diesem Text Layer soll ein weiterer Layer hinzugefügt werden als Umrandung (Alphakanal wählen, vergrößern, neuer layer, mit farbe füllen). Dafür kann man das Script von https://pete.nu/software/gimp-outliner/ nutzen, das funktioniert soweit auch gut.
Das ganze soll dann als png exportiert werden.

Ich hab das mit dem outliner script und BIMP schon versucht, aber BIMP hat das dann immer aufs ganze Bild angewandt anstatt auf einen Layer und ich hab nicht rausgefunden wie ich es auf einen Layer begrenze.

Sorry falls ich etwas bitter rüberkomme, ich bin einfach frustriert, frustriert das ich durch das scripting nicht durchblicke.

Hoffe mir kann jemand helfen, vielen Dank im voraus.
Benutzeravatar
anke
Site Admin
Beiträge: 1148
Registriert: Fr 21. Aug 2020, 20:54
Wohnort: Osnabrück
Deine Galerie: https://gimp-werkstatt.de/werkstatt-galerie/eleanora/
Betriebssystem: XUbuntu
Kontaktdaten:

Re: Batch Scripting Hilfe

Beitrag von anke »

hallo und willkommen im Forum!
Also scripten kann ich selber nicht. Bin halt keine Programmiererin ;) Aber wir hatten mal ein total cleveres Mitglied, die hat uns 3 Tutorien zum Scripten geschrieben:

Das bisschen Script-Fu macht sich von allein ... Part 1
Das bisschen Script-Fu macht sich von allein ... Part 2
Das bisschen Script-Fu macht sich von allein ... Part 3

Ich hoffe wir können dir damit ein wenig weiterhelfen.
Viel Spaß
Gruß Anke

Wer glaubt, dass Moderatoren moderieren
und Administratoren administrieren
der glaubt auch, dass Zitronenfalter Zitronen falten.
Benutzeravatar
Gimplyworxs
Beiträge: 536
Registriert: Sa 22. Aug 2020, 09:11
Wohnort: Crailsheim, BaWü
Deine Galerie: https://gimp-werkstatt.de/werkstatt-galerie/gimplyworxs
Betriebssystem: Linux Mint 19.2

Re: Batch Scripting Hilfe

Beitrag von Gimplyworxs »

Hallo,
das von dir genannte Script erwartet als eingabe die aktivierte Textebene. Das kann man per BIMP halt nicht bieten, weshalb es vermutlich scheitert.
Ich schau mir dein Problem gerne mal an. Hilfreich wäre mal so eine von deinen Dateien zu sehen.
Kannst du mir mal ne PM oder Mail schicken?
Viele Grüße
Gimplyworxs

Bild
compuscidave
Beiträge: 3
Registriert: Mo 14. Dez 2020, 19:46
Betriebssystem: Ubuntu

Re: Batch Scripting Hilfe

Beitrag von compuscidave »

@anke Danke dir, ich bin grad ein bisschen gnadschig aufs gimp-scripten... zum nächsten Mal schau ich mir die tutorials an ;)

@Gimplyworxs ich schick dir mal ne PM. Die Lösung packen wir dann wieder hier ins Thema für zukünftige Sucher.
compuscidave
Beiträge: 3
Registriert: Mo 14. Dez 2020, 19:46
Betriebssystem: Ubuntu

Re: Batch Scripting Hilfe

Beitrag von compuscidave »

So, noch mal abschließend, Gimplyworxs hat mir ein Script geschickt das schon sehr gut aussah und mit ein bisschen umstellen auch das gemacht hat was ich wollte.

Ich habe das Skript nun noch ein wenig verändert und nun tut es genau das was ich will:

Code: Alles auswählen

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

# https://stackoverflow.com/questions/5794640/how-to-convert-xcf-to-png-using-gimp-from-the-command-line
# http://gimpchat.com/viewtopic.php?f=9&t=15024

from gimpfu import *
import os



def batch_convert_xcf_to_png(inputFolder, outputFolder, color, randbreite, ebenen_name):
    ''' Convert the xcf images in a directory to png.

    Parameters:
    img : image The current image (unused).
    layer : layer The layer of the image that is selected (unused).
    inputFolder : string The folder of the images that must be modified.
    outputFolder : string The folder in which save the modified images.
    '''
    # Iterate the folder
    for file in os.listdir(inputFolder):
        try:
            # Build the full file paths.
            inputPath = inputFolder + "/" + file

            new_name = file.rsplit(".",1)[0] + ".png"
            outputPath = outputFolder + "/" + new_name

            # Open the file if is a XCF image.
            image = None
            if(file.lower().endswith(('.xcf'))):
                image = pdb.gimp_xcf_load(1,inputPath, inputPath)
                # ab hier
                layer = pdb.gimp_image_get_layer_by_name(image, ebenen_name)
                parent = pdb.gimp_item_get_parent(layer)

                # Auswahl aus Alphakanal:
                pdb.gimp_image_select_item(image, CHANNEL_OP_ADD, layer)
                # um randbreite größer:
                pdb.gimp_selection_grow(image, randbreite)

                # neue Ebene erstellen
                outline_layer = pdb.gimp_layer_new(image, image.width, image.height, RGBA_IMAGE, "outline", 100, LAYER_MODE_NORMAL)
                # Ebene einfügen
                pdb.gimp_image_insert_layer(image, outline_layer, parent, -1)
                # Ebene absenken unter den Text
                pdb.gimp_image_lower_item(image, outline_layer)

                # Vordergrundfarbe setzen:
                pdb.gimp_context_set_foreground(color)
                # Outline Ebene füllen
                # pdb.gimp_drawable_fill(outline_layer, FILL_FOREGROUND)
                pdb.gimp_edit_bucket_fill(outline_layer, BUCKET_FILL_FG, LAYER_MODE_NORMAL, 100, 0, FALSE, 0, 0)

                # Auswahl wieder entfernen
                pdb.gimp_selection_none(image)

                # bis hier
                
            # Verify if the file is an image.
            if(image != None):

                #layer = pdb.gimp_image_merge_visible_layers(image, gimpfu.CLIP_TO_IMAGE)
                layer = pdb.gimp_image_merge_visible_layers(image, 1)

                # Save the image.
                # pdb.file_png_save(image, drawable, filename, raw_filename, interlace, compression, bkgd, gama, offs, phys, time)
                pdb.file_png_save(image, layer, outputPath, outputPath, 0, 9, 0, 0, 0, 0, 0)

        except Exception as err:
            gimp.message("Unexpected error: " + str(err))




'''                
    img = pdb.gimp_file_load(filename, filename)
    new_name = filename.rsplit(".",1)[0] + ".png"
    layer = pdb.gimp_image_merge_visible_layers(img, gimpfu.CLIP_TO_IMAGE)

    pdb.gimp_file_save(img, layer, new_name, new_name)
    pdb.gimp_image_delete(img)
'''


register(
        "batch_convert_xcf_to_png",
        "convert chris",
        "convert ",
        "Chris O'Halloran",
        "Chris O'Halloran",
        "2014",
        "Batch batch convert xcf to png",
        "",  # start with no image
        [
            (PF_DIRNAME, "inputFolder", "Input directory", ""),
            (PF_DIRNAME, "outputFolder", "Output directory", ""),
            (PF_COLOR, "color", "Randfarbe", "#000000"),
            (PF_SPINNER, "randbreite", "Randbreite", 5, (1, 10, 1)),  # Default,(Minimun,Maximum, Schrittweite)
            (PF_STRING, "ebenen_name", "Name zu Umrandenden Ebene", "Product Text"),
        ],
        [],
        batch_convert_xcf_to_png, menu="<Image>/Test")



main()

Dieses Skript kann man über gimp ausführen, man gibt ein quell verzeichnis an, ein ausgangs verzeichnis. Rein gehen xcf files und raus kommen pngs.
Randfarbe auswähen womit dann eine schriftebene umrandet wird, ebenso breite und den namen der ebene die umrandet werden soll.

Dann anschmeißen und alle xcf's werden so behandelt und ausgegeben.

Dadurch konnte ich nun meine Kartenspiel-Übersetzung fertigstellen :)
Antworten