Hinzufügen einer Textebene mit weißem Hintergrund zum Bild mit gimp python-fu

Ich möchte einem Foto einen variablen Text (Dateiname) hinzufügen und den Hintergrund mit einer Farbe (weiß) füllen, damit der Text gut sichtbar ist.

Wie kann ich die bereits erstellte Textebene bequem zB Danube-Iron-Gates(c) TESTmit einem farbigen zB weißen Hintergrund füllen?

Ich verwende GIMP 2.10.2 (Windows10).

Der folgende Beispielcode führt bei zweimaliger Verwendung des Python-Plugins zum Ergebnisbild mit Text inklusive Rand, den ich hier angehängt habe. Der Code hat nur Entwicklungsstufe.

#!/usr/bin/env python

# --------------------------------------------
# Add file name box
# --------------------------------------------
# Change Log
# ============================================
# Version 0.0.1 Initial release.

import math
import os
import os.path
import sys

from array import array 
from gimpfu import *

#------------------------------
def format_pkz(sText):
    sConcatenatedText = sText + "(c) TEST"
    return sConcatenatedText

# -------------------------------------------------------------------------------------------
def add_filename_box(image, layer, use_filename, pkz1, placement):
    # set start of undo
    pdb.gimp_image_undo_group_start(image)

    # Save the current foreground color:
    pdb.gimp_context_push()

    # Set foreground and background color to default
    gimp.set_foreground(0,0,0)
    gimp.set_background(255, 255, 255)

    # use filename for pkz1
    if use_filename:
        filename = image.filename
        filename_w_ext = os.path.basename(filename)
        file_name, file_extension = os.path.splitext(filename_w_ext) 
        pkz1 = format_pkz(file_name)

        if placement == 0:      # top right
            xOffset = image.width - 630
            yOffset = 50
        elif placement == 1:    # down right
            xOffset = image.width - 630
            yOffset = image.height - 150
        elif placement == 2:    # down left
            xOffset = 50
            yOffset = image.height - 150        
        else:                   # top left
            xOffset = 50
            yOffset = 50
        # create layer with text and add it to the image: image, drawable, x, y, text, border, antialias, size, size_type, fontname
        pdb.gimp_text_fontname(image, None, xOffset, yOffset, pkz1 , 10, True, 64, PIXELS, "Verdana Bold")   

    else:                       # don't use file name
        xOffset = 50
        yOffset = 200
        # create layer with text and add it to the image: image, drawable, x, y, text, border, antialias, size, size_type, fontname
        pdb.gimp_text_fontname(image, None, xOffset, yOffset, pkz1 , 10, True, 64, PIXELS, "Verdana Bold")         

    # Restore the old foreground color:
    pdb.gimp_context_pop()
    # set end of undo
    pdb.gimp_image_undo_group_end(image)

# -----------------------------------------------------------------------------
# register the plug-in
# ----------------------------------------------------------------------------- 

register(
    "python_fu_add_filename_box",
    "My function test.",
    "My function test for developing cases.",
    "help-info.de",
    "help-info.de (c)",
    "2018-06-03",
    "<Image>/DEVELOP/Add filename box ...",
    "RGB*",
     [
            (PF_TOGGLE, "use_filename", "PKZ aus Dateinamen ableiten", 1),
            (PF_STRING, "pkz1", "User Input", "0000-0-00000"),            
            (PF_OPTION, "placement", "Placement", 3, ("top right", "down right", "down left", "top left")),         
     ],
     [],
     add_filename_box)

main()

Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Verschiedene Wege:

Einfache Eimerfüllung

Einfacher ist es, die Textebene im behindModus mit Eimern zu füllen:

pdb.gimp_selection_all(image)
pdb.gimp_edit_bucket_fill(textlayer, BUCKET_FILL_FG, LAYER_MODE_BEHIND, 100, 0, False, 0, 0)

Die Textebene hat jedoch sehr wenig Platz an den Seiten, sodass das Ergebnis unausgewogen sein kann. Ein Trick könnte darin bestehen, Ihren Text an beiden Enden mit Leerzeichen aufzufüllen, um die Textebene zu erweitern

Verwenden Sie eine andere Ebene (1)

Sie fügen eine Ebene unter der Textebene hinzu (dabei können Sie ihre Größe/Position auswählen) und füllen sie mit der gewünschten Farbe

Verwenden Sie eine andere Ebene (2)

Sie fügen eine weitere Ebene hinzu, die mit einer beliebigen Farbe gefüllt ist, erhalten dann eine Alpha-Auswahl auf der Textebene ( pdb.gimp_select_item(textlayer)) und füllen dann die Auswahl auf der hinzugefügten Ebene (und blenden den Text aus).

Völlig andere und weniger aufdringliche Technik, um die Sichtbarkeit des Textes sicherzustellen:

  • Holen Sie sich einen Pfad aus dem Text (path=pdb.gimp_vectors_new_from_text_layer(image, textlayer))
  • Erstellen Sie einen weißen Umriss, indem Sie den Pfad im Linienmodus mit einer 1-Pixel-Linie streichen:

    # Line mode for Stroke (new in 2.10)
    pdb.gimp_context_set_stroke_method(STROKE_LINE)
    pdb.gimp_context_set_line_width(width)
    
    # You may need to use these three as well
    pdb.gimp_context_set_line_cap_style(...)
    pdb.gimp_context_set_line_join_style(...)
    pdb.gimp_context_set_line_miter_limit(...)
    
    pdb.gimp_drawable_edit_stroke_item(drawable, path)
    

Auf ein paar schwierigen Hintergründen:

Geben Sie hier die Bildbeschreibung ein

Ich kann Ihnen eine einfache Möglichkeit nennen, dies in GIMP zu tun, ohne es zu skripten. Das kann Ihnen also beim Skript helfen.

  1. Erstellen Sie eine Textebene

  2. Verwerfen Sie die Textinformationen (dadurch wird der Text gerastert)

  3. Entfernen Sie den Alphakanal

Die transparenten Pixel in der Textebene werden mit der ausgewählten Hintergrundfarbe gefüllt. In diesem Beispiel ist die ausgewählte Hintergrundfarbe Weiß:

Geben Sie hier die Bildbeschreibung ein

Sie müssen die Textinformationen nicht entfernen. Dies hat den Vorteil, dass spätere Änderungen möglich sind, allerdings zum Preis, dass entweder der Text bearbeitet und der Hintergrund verloren geht oder eine neue Textebene aus diesen Informationen erstellt und dann der Hintergrund neu erstellt wird.