Ich habe Beispielcode für eines der Plug-Ins am Ende dieser Frage gepostet (weil es etwas langwierig ist). Dieser Code sollte in Gimp 3 Python-Fu laufen. Es sollte alle geöffneten Bilddateien durchgehen und eine Spline-Kurve auf das Histogramm anwenden, wodurch die bereits hellen Teile jedes Bilds noch mehr aufgehellt werden.
Der Code funktioniert im Allgemeinen. Bemerkenswerterweise erscheint der neue Menüeintrag an der erwarteten Stelle, und wenn darauf geklickt wird, während mindestens ein Bild geöffnet ist, wird die Prozedur whiten_all ausgeführt.
Ich habe jedoch drei Probleme:
1:
Ich muss 0 als zweiten Parameter an Curves_spline übergeben, was einen schlechten Stil darstellt. Es wäre besser, stattdessen eine symbolische Konstante zu verwenden. Ich habe die Dokumentation studiert und in den Verfahrensbrowser geschaut. Ersteres listet die Konstante als GIMP_HISTOGRAM_VALUE auf, letzteres jedoch als HISTOGRAM-VALUE (d. h. mit einem Bindestrich anstelle von Unterstrichen und ohne das führende GIMP). Keine der beiden Syntaxen funktioniert.
Ich habe auch Dinge wie Gimp.HISTOGRAM_VALUE und viele ähnliche Variationen ausprobiert, aber ohne Erfolg. Jedes Mal beschwert sich GIMP, dass der Name nicht definiert ist.
Was wäre die richtige Syntax, um die 0 (der zweite Parameter) im Aufruf von Curves_spline durch das Symbol HISTOGRAM_VALUE zu ersetzen?
[ Hinweis: In GIMP 2 war HISTOGRAM_VALUE korrekt. ]
2:
In GIMP 2 hatten wir die Funktion pdb.gimp_image_get_active_drawable(image), um das aktive Zeichenelement aus einem Bild abzurufen. Es scheint, dass diese Funktion aus GIMP 3 entfernt wurde und es keinen Ersatz gibt. Zumindest konnte ich während der mehrstündigen Recherche keinen Ersatz finden.
Die Lösung für dieses Problem ist normalerweise so etwas wie drawable = Gimp.Image.get_selected_drawables(image)[0] oder drawable = Gimp.Image.get_layers(image)[0] oder einfach drawable = drawables[0] (im letzteren Fall ist drawables einfach einer der Funktionsparameter von). whiten_all).
Diese Lösungen haben jedoch Nachteile:
Normalerweise wird in den Bildern nichts ausgewählt, wenn whiten_all ausgeführt wird, daher bin ich mir nicht sicher, was das zurückgegebene Zeichenelement in der ersten Lösung tatsächlich ist. Die Dokumentation erklärt es, aber ich habe es noch nicht ganz verstanden. Daher ist die erste Lösung nicht ideal.
Offensichtlich gibt es neben Ebenen auch andere Zeichenobjekte, was die zweite Lösung nutzlos macht. Ich möchte wirklich das aktive Drawable bekommen, was auch immer das sein mag. Insbesondere möchte ich es erhalten, auch wenn es keine Ebene ist.
Was die dritte Lösung betrifft, bin ich mir nicht sicher, da ich nicht weiß, welche Drawables beim Aufruf im fünften Parameter an whiten_all übergeben werden. Ich konnte keine vernünftige Dokumentation dazu finden.
Mein mangelndes Verständnis dafür, wie ich das aktive Drawable bekomme, könnte die Ursache für mein drittes (und schlimmstes) Problem sein (siehe unten).
Was ist der GIMP 3-Ersatz für GIMP 2 gimp_image_get_active_drawable(), oder wenn es keinen solchen Ersatz gibt, wie kann ich das aktive Drawable erhalten, vorzugsweise ohne durch alle zu blättern? Drawables und prüfen, welches davon „aktiv“ ist?
3:
Das ist das schlimmste Problem; es kann mit Problem 2 zusammenhängen. Wenn das Plug-in ausgeführt wird, wird whiten_all ausgeführt, aber es verändert die Bilder in keiner Weise.
Ich weiß, dass es aufgrund der folgenden Beobachtung ausgeführt wird: Nachdem ich die Zeile #Gimp.message("Hello world!") auskommentiert habe, wird die Meldung „Hello world!“ angezeigt. erscheint in der Statusleiste von GIMP, wenn ich das Plug-in ausführe.
Außerdem benötigte das Plug-in in GIMP 2 einige Sekunden pro Bild (bei der Verarbeitung normaler Bilder, die in früheren Phasen meines Workflows erstellt wurden) und zeigte während dieser Zeit einen Fortschrittsbalken an. Genau das Gleiche passiert in GIMP 3 (einschließlich Fortschrittsbalken). Daher bin ich davon überzeugt, dass zwar etwas berechnet wird, das Ergebnis aber aus unbekannten Gründen nicht auf die entsprechenden Bilder angewendet wird.
Möglicherweise funktioniert es nicht, weil ich das falsche Drawable verwende (siehe Problem 2.). Um das richtige Drawable zu erhalten, habe ich alle Varianten verwendet, die in der Beschreibung von Problem 2. erwähnt werden, jedoch ohne Erfolg. Unabhängig davon, wie ich das Zeichenobjekt erhalte, ändert sich das sichtbare Bild nicht, wenn whiten_all ausgeführt wird.
Warum sind in den geöffneten Bildern keine Änderungen sichtbar, wenn das Plug-in ausgeführt wird?
Abschließend ist hier der Code:
Code: Select all
#!/usr/bin/env python3
import sys
import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
from gi.repository import GLib
class PP_WhitenAll (Gimp.PlugIn):
def do_query_procedures(self):
return [ "pp-treat-normal-scans" ]
def do_set_i18n (self, name):
return False
def do_create_procedure(self, name):
procedure = Gimp.ImageProcedure.new(self, name,
Gimp.PDBProcType.PLUGIN,
self.whiten_all, None)
procedure.set_image_types("*")
procedure.set_menu_label("Whiten Images (Normal Paper)")
procedure.add_menu_path('/Colors')
procedure.set_documentation("Whiten Images (Normal Paper)",
"Whiten Images (Normal Paper)",
name)
procedure.set_attribution("Test", "Test", "2026-01-03")
return procedure
def whiten_all(self, procedure, run_mode, image, drawables, config, run_data):
#Gimp.message("Hello world!")
images = Gimp.get_images()
for image in images:
image.undo_group_start()
drw=Gimp.Image.get_selected_drawables(image)[0]
Gimp.Drawable.curves_spline(drw,
0,
[0,0,108,108,192,192,220,227,224,255])
image.undo_group_end()
return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Gimp.main(PP_WhitenAll.__gtype__, sys.argv)
Mobile version