Script-fu Skript verhält sich in Konsole anders als übers Menü?
Ich habe in GIMP mit script-fu ein Skript geschrieben, das mir einen Rahmen rund um das aktive Bild wegschneiden soll (oben 25 px, alle andere Seiten je 6 px).
Wenn ich das Skript in der Konsole ausführe, funktioniert das Skript.
Wenn ich das Skript aber übers Menü starte, werden mir vom Bild rechts 12 px und unten 31 px weggeschnitten, oben und links jedoch nichts.
Hat jemand einen Hinweis, wie man das beheben kann?
GIMP-Version GIMP 2.10.38 (Revision 1)
Herzlichen Dank!
Hier mein Skript:
(define (crop-image)
(let*
(
(image (car(gimp-image-list)))
(width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
; Neue Dimensionen berechnen
(new-width (- width 12)) ; 6 Pixel links und rechts
(new-height (- height 31)) ; 25 Pixel oben und 6 Pixel unten
; Neuer Startpunkt
(x 6)
(y 25)
)
(gimp-message (string-append "Image: " (number->string image)))
(gimp-message (string-append "Width: " (number->string width)))
(gimp-message (string-append "Height: " (number->string height)))
(gimp-message (string-append "NWidth: " (number->string new-width)))
(gimp-message (string-append "NHeight: " (number->string new-height)))
(gimp-message (string-append "x: " (number->string x)))
(gimp-message (string-append "y: " (number->string y)))
(gimp-image-crop image new-width new-height x y)
)
)
;; Registriere das Script im Script-Fu Menü
(script-fu-register
"crop-image" ;; Funktionsname
"NBild Rahmen entfernen (oben 25 px, sonst 6 px)" ;; Beschreibung
"Zuschneide ein Bild 25 px oben, 6 px andere Seiten" ;; Hilfetext
"Name" ;; Dein Name hier
"Name" ;; Dein Name hier
"2025" ;; Jahr
"RGB*" ;; Farbmodi
'((SF-IMAGE "Bild" 0)) ;; Bild als Eingabewert
)
;; Binde das Skript an das Menü
(script-fu-menu-register "crop-image" "<Image>/Tools/")
Ok, das Problem ist gelöst.
Das Problem war die Zuweisung der Bild ID:
(image (car(gimp-image-list)))
dies weist "image" nicht die Bild-ID zu, sondern die Anzahl der offenen Bilder. Deshalb funktioniert das Skript nur, wenn die Anzahl der offenen Bilder zufällig mit der Bild-ID übereinstimmt.
gimp-image-list liefert eine Liste zürück bestehend aus der Anzahl der Bilder und einem Vektor mit Bild-IDs.
So ist's richtig:
(image (vector-ref (cadr(gimp-image-list)) 0))
Erklärung:
(cadr(gimp-image-list)) liefert das 2. Element der Liste zurück (den Vektor mit den Bild-IDs)
vector-ref (x 0) holt dann aus dem vektor das 1. Element (=index 0). Das ist die benötigte Bild-ID.
1 Antwort
Probier das mal, hab es angepasst:
Hier ist eine angepasste Version deines Skripts:
(define (crop-image)
(let* (
(image (car(gimp-image-list)))
(width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
;; Neue Dimensionen berechnen
(new-width (- width 12)) ;; 6 Pixel links und rechts
(new-height (- height 31)) ;; 25 Pixel oben und 6 Pixel unten
;; Neuer Startpunkt
(x 6)
(y 25)
)
;; Debugging-Ausgaben
(gimp-message (string-append "Image: " (number->string image)))
(gimp-message (string-append "Width: " (number->string width)))
(gimp-message (string-append "Height: " (number->string height)))
(gimp-message (string-append "NWidth: " (number->string new-width)))
(gimp-message (string-append "NHeight: " (number->string new-height)))
(gimp-message (string-append "x: " (number->string x)))
(gimp-message (string-append "y: " (number->string y)))
;; Bild zuschneiden
;; Überprüfen ob neue Dimensionen gültig sind
;; Verhindern von negativen Werten oder Werten kleiner als Null.
;; Optional kann hier auch eine Fehlerbehandlung eingebaut werden.
;; Zuschneiden des Bildes
;(if (> new-width 0)
;(if (> new-height 0)
;(gimp-image-crop image new-width new-height x y)
;))
))
;; Registriere das Script im Script-Fu Menü
(script-fu-register
"crop-image"
"NBild Rahmen entfernen"
"Zuschneide ein Bild 25 px oben, 6 px andere Seiten"
""
""
"2025"
"*"
'((SF-IMAGE "Bild" 0))
)
;; Binde das Skript an das Menü
(script-fu-menu-register "crop-image" "<Image>/Tools/")
Danke.
Was bewirken denn deine Anpassungen?
Oder hast du das ChatGPT und Co anpassen lassen?