Seite 1 von 1

Batch Scripting Hilfe

Verfasst: Mo 14. Dez 2020, 20:01
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.

Re: Batch Scripting Hilfe

Verfasst: Mo 14. Dez 2020, 23:21
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

Re: Batch Scripting Hilfe

Verfasst: Di 15. Dez 2020, 09:53
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?

Re: Batch Scripting Hilfe

Verfasst: Mi 16. Dez 2020, 09:35
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.

Re: Batch Scripting Hilfe

Verfasst: Di 12. Jan 2021, 18:39
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 :)