Wie zentriert man Ebenen auf Bildern?

Benutzeravatar
schnulli2
Beiträge: 64
Registriert: So 29. Aug 2010, 22:34
Skype:
Wohnort: Elsdorf, Rhein-Erft-Kreis
Kontaktdaten:

Wie zentriert man Ebenen auf Bildern?

Beitragvon schnulli2 » Mo 21. Mai 2012, 16:10

Mein erstes Projekt im Schreiben von Skripten geht dem Ende entgegen.

Mit diesem Skript kann man die aktuelle Ebene auf das Bild zentrieren, so dass die Mittelpunkte übereinander liegen.
Desweiteren kann man eine neue Ebene mit Höhe, Breite und Füllfarbe erstellen und diese entweder auf das Bild oder auf die aktuelle Ebene zentrieren.
Die neue Ebene wird im Ebenenstapel über der aktuellen Ebene eingefügt.

Code: Alles auswählen

    ;======================================================
    ; Teil 1 Registrierung des Skriptes
    ;======================================================
    (script-fu-register                  ; GIMP-Anweisung
       "script-fu-zentrierung2"           ; Der Name des Skriptes
       "Ebenenzentrierung2"               ; Anzeigename unter GIMP
       "Hier soll eine Ebene auf einem\
        Bild oder der darunterliegenden\
      Ebene zentriert werden"          ; Kurze Skriptbeschreibung
       "schnulli2"                       ; Autor des Skriptes
       "Copyleft schnulli2"              ; Copyright
       "29.01.2012"                      ; Erstellungsdatum
       "RGB*"                            ; Bildtypen
      SF-IMAGE "Das Bild" 0
       SF-OPTION "Was soll zentriert werden?"    '("Aktuelle Ebene" "Neue Ebene" "Keine")    ;  "Neue Textebene"
      SF-OPTION "Zentrierungsbezug"             '("Bild" "darunter liegende bzw. aktuelle Ebene")
      SF-ADJUSTMENT "Breite der neuen Ebene" '(125 1 1024 1 10 0 SF-SLIDER)
      SF-ADJUSTMENT "Höhe der neuen Ebene" '(125 1 768 1 10 0 SF-SLIDER)
      SF-COLOR "Füllfarbe der neuen Ebene" '(0 0 0)
    )
    ;======================================================
    ; Teil 2 Festlegen der Menüstruktur
    ;======================================================
    (script-fu-menu-register "script-fu-zentrierung2" "<Image>/entwicklung/test/eigene Skripte")
    ;======================================================
    ; Teil 3 Das Script
    ;======================================================
    (define                       ; Beginn des Programmes
       (script-fu-zentrierung2   ; Name
           in-Bild               ; Einlesen der Parameter
         in-Was
         in-Wohin
         in-Breite
         in-Hoehe
         in-color
      )
      (let* 
         (                   ; Variablendeklaration
            (BildBreite (car (gimp-image-width in-Bild)))
            (BildHoehe (car (gimp-image-height in-Bild)))
            (ArbEbene (car (gimp-image-get-active-layer in-Bild)))
                (ArbEbene2 (car (gimp-layer-new in-Bild in-Breite in-Hoehe RGB-IMAGE "neue Ebene" 100 NORMAL)))
            (EbeneBreite (car (gimp-drawable-width ArbEbene)))
            (EbeneHoehe (car (gimp-drawable-height ArbEbene)))
            (BezugBreite 900)
            (BezugHoehe 600)
            (EbeneUrsprungOben 0)
            (EbeneUrsprungLinks 0)
         )                   ; Ende Variablendeklaration
                           ; Beginn der Programmstruktur
            (if (< in-Was 2)               ; soll zentriert werden?
               (begin
                  (cond ((= in-Was 0)    ; ja, aktuelle Ebene
                        (if (= in-Wohin 0)   
                            (begin           ; auf das Bild
                              (set! EbeneUrsprungOben (/ (- BildHoehe EbeneHoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite EbeneBreite) 2))
                              (gimp-layer-set-offsets ArbEbene EbeneUrsprungLinks EbeneUrsprungOben)
                           )
                           (begin           ; auf darunter liegende Ebene                       hier muß noch angepaßt werden
                              (set! EbeneUrsprungOben (/ (- BildHoehe EbeneHoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite EbeneBreite) 2))
                              (gimp-layer-set-offsets ArbEbene EbeneUrsprungLinks EbeneUrsprungOben)
                           )
                        )     
                        )
                       ((= in-Was 1)         ; ja, neue Ebene
                        (if (= in-Wohin 0)
                            (begin           ; auf das Bild
                                   (gimp-context-set-foreground in-color)
                                        (gimp-drawable-fill ArbEbene2 0)
                                 (set! EbeneUrsprungOben (/ (- BildHoehe in-Hoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite in-Breite) 2))
                              (gimp-layer-set-offsets ArbEbene2 EbeneUrsprungLinks EbeneUrsprungOben)
                              (gimp-image-add-layer in-Bild ArbEbene2 -1)
                           )
                           (begin          ; auf aktueller Ebene
                                   (gimp-context-set-foreground in-color)
                                        (gimp-drawable-fill ArbEbene2 0)
                              (set! EbeneUrsprungOben (+ (/ (- EbeneHoehe in-Hoehe) 2) (cadr( gimp-drawable-offsets ArbEbene))))
                              (set! EbeneUrsprungLinks (+ (/ (- EbeneBreite in-Breite) 2) (car( gimp-drawable-offsets ArbEbene))))
                              (gimp-layer-set-offsets ArbEbene2 EbeneUrsprungLinks EbeneUrsprungOben)
                              (gimp-image-add-layer in-Bild ArbEbene2 -1)
                           )
                        )
                       )
                  )
                  (gimp-display-new in-Bild)
               )
            )
                            ; Ende Programmstruktur
      )    ;Ende let*
   )   ;Ende define



bitte noch nicht so viel schimpfen, es ist nicht ganz fertig. Ich versuche immer noch die aktuelle Ebene auf der darunterliegenden Ebene zu zentrieren. das gelingt mir immer noch nicht, weil ich nicht an die ID dieser Ebene rankomme. Der Plan war eigentlich so, dass ich von der ID der aktuellen Ebene 1 abziehe und damit die ID der darunterliegenden Ebene berechnet ist. Dem ist nicht so.
Nun heißt es: Lies dich weiter in die Funktionen der mitgeliferten ScriptFu's ein. Das fällt mir nicht ganz so leicht, weil mein Englischunterricht schon ein Weilchen her ist. Und das Kauderwelsch der Übersetzertante Google ist auch nicht immer das goldene vom Ei.

@ ClaraFall: hast du beim scripten irgendwas gelesen über Listen von Ebenenstapel?
Mit dem Einlesen des Ebenenstapels müßte man doch auf bestimmte Ebenen zugreifen können, oder nicht?

edit:
Es ist zum Ausliefern fertig :gewonnen:
Bild

mit diesem Script kann man aktuelle oder neu zu erstellende Ebenen auf dem Bild bzw, Ebenen zentrieren.
Die Erklärung der einzelnen Auswahlmöglichkeiten:

1. Was soll zentriert werden?
Auswahl aus: aktuelle Ebene oder neue Ebene. Der Auswahlpunkt "Keine" bewirkt nichts, das ist wie ein Notausgang.

2. Zentrierungsbezug
Auswahl aus: Bild oder darunterliegende bzw. aktuelle Ebene
zur Erklärung: Hier kann gesagt werden, worauf zentriert werden soll.
Die aktuelle Ebene kann auf dem Bild oder auf der im Ebenenstapel darunterliegenden Ebene zentriert werden.
Eine neue Ebene kann auf dem Bild oder der aktuellen Ebene zentriert werden.

3. Breite/Höhe der neuen Ebene
Hier bestimmt man die Größe der neuen Ebene. Breite maximal 1024Pixe, Höhe maximal 768 Pixel.

4. Füllfarbe der neuen Ebene
hier kann die Farbe eingestellt werden, mit der die neue Ebene gefüllt ist.

Viel Spaß mit dem Script. Der Link zum Download befindet sich weiter unten im Thread.

edit 2:

Nun ist es soweit: Ich habe fertig :gewonnen:

Hier kommt der Quelltext:

Code: Alles auswählen

    ;======================================================
    ; Teil 1 Registrierung des Skriptes
    ;======================================================
    (script-fu-register                  ; GIMP-Anweisung
       "script-fu-zentrierung"           ; Der Name des Skriptes
       "Ebenenzentrierung"               ; Anzeigename unter GIMP
       "Hier soll eine Ebene auf einem Bild oder der darunterliegenden Ebene zentriert werden"          ; Kurze Skriptbeschreibung
       "schnulli2"                       ; Autor des Skriptes
       "Copyleft schnulli2"              ; Copyright
       "04.06.2012"                      ; Erstellungsdatum
       "RGB*"                            ; Bildtypen
      SF-IMAGE "Das Bild" 0
       SF-OPTION "Was soll zentriert werden?"    '("Aktuelle Ebene" "Neue Ebene" "Neue Textebene")   
      SF-OPTION "Zentrierungsbezug"             '("Bild" "darunter liegende bzw. aktuelle Ebene")
      SF-ADJUSTMENT "Breite der neuen Ebene" '(125 1 1024 1 10 0 SF-SLIDER)
      SF-ADJUSTMENT "Höhe der neuen Ebene" '(125 1 768 1 10 0 SF-SLIDER)
      SF-COLOR "Füllfarbe der neuen Ebene" '(0 0 0)
      SF-STRING "zu zentrierender Text" "Text"
      SF-FONT "Schriftart" "Times New Roman"
      SF-ADJUSTMENT  "Schrifthöhe"     '(20 1 1000 1 10 0 1)
      SF-COLOR "Schriftfarbe" '(0 0 0)
    )
    ;======================================================
    ; Teil 2 Festlegen der Menüstruktur
    ;======================================================
    (script-fu-menu-register "script-fu-zentrierung" "<Image>/Filters/Ebenenbearbeitung")
    ;======================================================
    ; Teil 3 Das Script
    ;======================================================
    (define                       ; Beginn des Programmes
       (script-fu-zentrierung    ; Name
           in-Bild               ; Einlesen der Parameter
         in-Was
         in-Wohin
         in-Breite
         in-Hoehe
         in-color
         in-Text
         in-Font
         in-FontHoehe
         in-FontColor
      )
      (let* 
         (                   ; Variablendeklaration
            (BildBreite (car (gimp-image-width in-Bild)))
            (BildHoehe (car (gimp-image-height in-Bild)))
            (EbeneZahl (car (gimp-image-get-layers in-Bild)))
            (EbeneListID (cadr (gimp-image-get-layers in-Bild)))
            (Zaehler 0)
            (ArbEbene (car (gimp-image-get-active-layer in-Bild)))
            (ArbEbeneUnter 0)
                (ArbEbeneNeu (car (gimp-layer-new in-Bild in-Breite in-Hoehe RGBA-IMAGE "neue Ebene" 100 NORMAL)))
            (TextEbeneNeu (car (gimp-text-layer-new in-Bild in-Text in-Font in-FontHoehe 0)))
            (EbeneBreite (car (gimp-drawable-width ArbEbene)))
            (EbeneHoehe (car (gimp-drawable-height ArbEbene)))
            (BezugBreite 900)
            (BezugHoehe 600)
            (TextBreite (car (gimp-drawable-width TextEbeneNeu)))
            (TextHoehe (car (gimp-drawable-height TextEbeneNeu)))
            (EbeneUrsprungOben 0)
            (EbeneUrsprungLinks 0)
            (aktuelleVGFarbe (car (gimp-context-get-foreground)))
         )                   ; Ende Variablendeklaration
             ; Beginn der Programmstruktur
               (cond ((= in-Was 0)    ; ja, aktuelle Ebene
                     (begin
                        (if (= in-Wohin 0)   
                           (begin           ; auf das Bild
                              (set! EbeneUrsprungOben (/ (- BildHoehe EbeneHoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite EbeneBreite) 2))
                           )
                           (begin           ; auf darunter liegende Ebene                       
                              (while (<> (vector-ref EbeneListID Zaehler) ArbEbene)    ;suche ArbEbenen ID in der EbeneListID
                                    (set! Zaehler (+ Zaehler 1))
                              )
                              (if (<> (+ Zaehler 1) EbeneZahl)
                                 (begin
                                    (set! Zaehler (+ Zaehler 1))
                                    (set! ArbEbeneUnter (vector-ref EbeneListID Zaehler))
                                    (set! BezugHoehe (car (gimp-drawable-height ArbEbeneUnter)))
                                    (set! BezugBreite (car (gimp-drawable-width ArbEbeneUnter)))
                                    (set! EbeneUrsprungOben (+ (/ (- BezugHoehe EbeneHoehe) 2) (cadr( gimp-drawable-offsets ArbEbeneUnter))))
                                    (set! EbeneUrsprungLinks (+ (/ (- BezugBreite EbeneBreite) 2) (car( gimp-drawable-offsets ArbEbeneUnter))))
                                 )
                                 (begin
                                    (set! EbeneUrsprungOben (/ (- BildHoehe EbeneHoehe) 2))
                                    (set! EbeneUrsprungLinks (/ (- BildBreite EbeneBreite) 2))
                                 )   
                              )
                           )
                        )
                     (gimp-layer-set-offsets ArbEbene EbeneUrsprungLinks EbeneUrsprungOben)
                     )
                    )
                    ((= in-Was 1)         ; ja, neue Ebene
                     (begin
                        (gimp-context-set-foreground in-color)
                        (gimp-drawable-fill ArbEbeneNeu 0)
                        (gimp-context-set-foreground aktuelleVGFarbe)
                        (if (= in-Wohin 0)
                           (begin           ; auf das Bild
                              (set! EbeneUrsprungOben (/ (- BildHoehe in-Hoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite in-Breite) 2))
                           )
                           (begin          ; auf aktueller Ebene
                              (set! EbeneUrsprungOben (+ (/ (- EbeneHoehe in-Hoehe) 2) (cadr( gimp-drawable-offsets ArbEbene))))
                              (set! EbeneUrsprungLinks (+ (/ (- EbeneBreite in-Breite) 2) (car( gimp-drawable-offsets ArbEbene))))
                           )
                        )
                        (gimp-layer-set-offsets ArbEbeneNeu EbeneUrsprungLinks EbeneUrsprungOben)
                        (gimp-image-add-layer in-Bild ArbEbeneNeu -1)
                        
                     )
                    )
                   ((= in-Was 2)          ; ja, neue Textebene
                    (begin
                        (if (= in-Wohin 0)
                           (begin           ; auf das Bild
                              (set! EbeneUrsprungOben (/ (- BildHoehe TextHoehe) 2))
                              (set! EbeneUrsprungLinks (/ (- BildBreite TextBreite) 2))
                           )
                           (begin          ; auf aktueller Ebene
                              (set! EbeneUrsprungOben (+ (/ (- EbeneHoehe TextHoehe) 2) (cadr( gimp-drawable-offsets ArbEbene))))
                              (set! EbeneUrsprungLinks (+ (/ (- EbeneBreite TextBreite) 2) (car( gimp-drawable-offsets ArbEbene))))
                           )
                        )
                        (gimp-layer-set-offsets TextEbeneNeu EbeneUrsprungLinks EbeneUrsprungOben)                        
                        (gimp-image-add-layer in-Bild TextEbeneNeu -1)
                        (gimp-text-layer-set-color TextEbeneNeu in-FontColor)
                        (gimp-layer-resize TextEbeneNeu TextBreite TextHoehe 0 0)
                    )
                   )
               )
               (gimp-displays-flush in-Bild)
             ; Ende Programmstruktur
      )    ;Ende let*
   )   ;Ende define


Im Screenshot erkannt man, dass nur die Funktion zum Erstellen einer neuen Textebene hinzugefügt wurde.
#

Zur Erklärung:
5. zu zentrierender Text:
Hier wird der Text eingegeben, der als Textebene zentriert werden soll.

6. Schriftart
Hier kann die voreingestellte Schriftart "Times New Roman" geändert werden; es erscheint das Schriftartenmenü von Gimp.

7. Schrifthöhe
Die Schrifthöhe kann hier von 1px bis 1000 px verändert werden; Voreinstellung ist 20px.

8. Schriftfarbe
Hier kann die Farbe des Textes verändert werden; Voreinstellung ist schwarz.

Die neue Textebene hat einen transparenten Hintergrund und wird im Ebenenstapel über der aktuellen Ebene eingefügt.
Das Skript erscheint unter Filter-->Ebenenbearbeitung-->Ebenenzentrierung.
Das Zip-File findet man hier:
Zentrierung

Viel Spaß mit dem Skript, wenn ihr da überhaupt irgendwas mit anfangen könnt :think:
Zuletzt geändert von schnulli2 am Sa 9. Jun 2012, 00:05, insgesamt 2-mal geändert.
schnulli2 's Galerie findet man hier

ClaraFall
Beiträge: 99
Registriert: Di 5. Jul 2011, 20:36
Skype:
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon ClaraFall » Mo 21. Mai 2012, 17:31

Hallo Lieber schnulli2,

es gäbe einiges zu Deinem Skript zu bemerken,
da Du aber noch nicht fertig sein willst. hebe ich mir das für später auf. ;)

Dafür möchte ich Dir lieber Deine Frage beantworten.
Ebenen IDs sind einmalig, das bedeutet GIMP erstellt für jede Ebene eine neue ID
und diese ID behält die Ebene so lange, bis:
- das Bild geschlossen oder
- GIMP beendet oder
- die Ebene gelöscht oder
- die Ebene zusammengefaßt wird.

Wenn Ebenen jetzt neu gemischt oder innerhalb eines Ebenenstapels neue Ebenen eingefügt werden,
dann sind die IDs dieser Ebenen natürlich nicht mehr fortlaufend.

Die Funktion gimp-image-get-layers gibt eine Liste zurück,
deren erster Wert die Anzahl der Layer ist (also 0 bis irgendwas)
Danach kommen die Layer-IDs in der richtigen Reihenfolge,
wobei die Zählung im Ebenenstapel von oben beginnt.
Wenn Du also die Liste durchprüfst, bis Du die ID der aktuellen Ebene gefunden hast,
dann ist die nächste ID in der Liste, die der Ebene darunter (falls es darunter noch eine Ebene gibt).

Hoffentlich habe ich mich einigermaßen verständlich ausgedrückt.
Solltest Du mit der Funktion nicht zurecht kommen,
dann werde ich versuchen es noch ausführlicher zu erläutern.


Liebe Grüße
Clara

Benutzeravatar
schnulli2
Beiträge: 64
Registriert: So 29. Aug 2010, 22:34
Skype:
Wohnort: Elsdorf, Rhein-Erft-Kreis
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon schnulli2 » Mo 21. Mai 2012, 20:10

Ich glaube, das war schon sehr ausführlich erklärt. Jetzt werde ich mir überlegen, wie ich an die unter der aktuell liegenden Ebene rankomme. Ich hätte vermutlich den Stapel von unten begonnen. :dank:

Anmerkungen zum Script sind jederzeit willkommen. So kann ich jetzt nur grübeln, ob und was ich falschgemacht habe. :heul:

Eine Erweiterung des Scriptes steht noch an. Dabei geht es um das Zentrieren einer neuen Textebene, die eingegeben werden soll. :zwinker:
schnulli2 's Galerie findet man hier

ClaraFall
Beiträge: 99
Registriert: Di 5. Jul 2011, 20:36
Skype:
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon ClaraFall » Di 22. Mai 2012, 13:35

Hallo Lieber schnulli2,

um ein wenig Licht in die Materie zu bringen,
vor allem aber, um nicht etwa etwas lange Weile aufkommen zu lassen
hier mal wie gewünscht drei zwei Anmerkungen:

KEINE
In Deiner Option "Was soll zentriert werden?" steht der Wert "Keine".
Im Augenblick passiert da noch nicht sehr viel, wenn dieser Wert ausgewählt wird.
Das heißt z.Z. ist er völlig Funktionslos, verwirrt also ein wenig.

Vordergrundfarbe
Nach Ablauf Deines Skriptes ist meine Vordergrundfarbe geändert.
Ist das so gewollt.
Mir würde es viel besser gefallen,
wenn mich nach Skriptende wieder meine eingestellte Farbe anlächelt.

gimp-display-new
Warum benutzt Du diese Funktion?
Sie öffnet nur eine 2. Ansicht des bereits vorhandenen Bildes.
Es ist also kein neues Bild. Jede Änderung in einem Fenster,
geschieht auch im anderen.
Willst Du das aktuelle Bild nur auffrischen benutze lieber gimp-displays-flush.
Willst Du das Bild wirklich duplizieren ist vorher ein gimp-image-duplicate angesagt.

Wie gesagt, es kann ja sein, daß Du da schon was geplant hattest.
Jedenfalls lasse ich mich mal überraschen.


Liebe Grüße
Clara

Benutzeravatar
schnulli2
Beiträge: 64
Registriert: So 29. Aug 2010, 22:34
Skype:
Wohnort: Elsdorf, Rhein-Erft-Kreis
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon schnulli2 » Di 22. Mai 2012, 20:03

ClaraFall hat geschrieben:...
KEINE
In Deiner Option "Was soll zentriert werden?" steht der Wert "Keine".
Im Augenblick passiert da noch nicht sehr viel, wenn dieser Wert ausgewählt wird.
Das heißt z.Z. ist er völlig Funktionslos, verwirrt also ein wenig.


Dort wird nie etwas passieren. Das ist ein kleiner Notausgang :pfeif:
Es wird ja auch keine Funktion ausgewählt. Wenn es aber zu sehr verwirrt, werde ich das wieder rausnehmen.

ClaraFall hat geschrieben:Vordergrundfarbe
Nach Ablauf Deines Skriptes ist meine Vordergrundfarbe geändert.
Ist das so gewollt.
Mir würde es viel besser gefallen,
wenn mich nach Skriptende wieder meine eingestellte Farbe anlächelt.


Nein das ist nicht gewollt, sondern nicht konsequent programmiert.
Mir war das gar nicht aufgefallen, aber dafür ist ja eine Diskussion gut.
Das wird auf alle Fälle geändert.

ClaraFall hat geschrieben:gimp-display-new
Warum benutzt Du diese Funktion?
Sie öffnet nur eine 2. Ansicht des bereits vorhandenen Bildes.
Es ist also kein neues Bild. Jede Änderung in einem Fenster,
geschieht auch im anderen.
Willst Du das aktuelle Bild nur auffrischen benutze lieber gimp-displays-flush.
Willst Du das Bild wirklich duplizieren ist vorher ein gimp-image-duplicate angesagt. ...


Jetzt habe ich die Antwort auf meine Frage aus deinem Tut 3. :super:
Vermutlich setzt man diese Funktion nur ein, wenn ein neues Bild erzeugt werden soll.
Nebenbei bemerkt: Vielleicht solltest du deine Scripts daraufhin auch nochmal kontrollieren?
Ich glaube nämlich, dass das bei dir auch vorkommt. Bin mir aber nicht sicher.
:pfeif:

An der Programmierung zur zentrierung auf der darunterliegenden Ebene Habe ich mich schon versucht.
Leider klappt das noch nicht so, wie ich erwartet hatte. Gimp zeigt mir bei der Nutzung dieses Punktes eine Illegale Funktion an.

hier ist der Schnipsel dazu:

Code: Alles auswählen

                           (begin           ; auf darunter liegende Ebene                       hier muß noch angepaßt werden
;======================================
                              (if (> EbeneZahl 1)
                                 (begin
                                    (while (<> (car (EbeneListID)) ArbEbene)
                                           (set! EbeneListID (cdr (EbeneListID)))
                                    )
                                                (set! ArbEbene (cadr (EbeneListID)))
                                                (set! BezugHoehe (gimp-drawable-height ArbEbene))
                                                (set! BezugBreite (gimp-drawable-width ArbEbene))
                                      (set! EbeneUrsprungOben (+ (/ (- EbeneHoehe BezugHoehe) 2) (cadr( gimp-drawable-offsets ArbEbene))))
                                      (set! EbeneUrsprungLinks (+ (/ (- EbeneBreite BezugBreite) 2) (car( gimp-drawable-offsets ArbEbene))))
                                                (gimp-layer-set-offsets (gimp-image-get-active-layer in-Bild) EbeneUrsprungLinks EbeneUrsprungOben)
                                 )
                              )
;====================================                                    
;                              (set! EbeneUrsprungOben (/ (- BildHoehe EbeneHoehe) 2))
;                              (set! EbeneUrsprungLinks (/ (- BildBreite EbeneBreite) 2))
;                              (gimp-layer-set-offsets ArbEbene EbeneUrsprungLinks EbeneUrsprungOben)
                           )


Ich vermute, es fehlt irgendwo eine Klammer. Oder ich rufe eine Funktion falsch auf.
Muß mich in einer ruhigen Minute damit nochmal beschäftigen.
schnulli2 's Galerie findet man hier

ClaraFall
Beiträge: 99
Registriert: Di 5. Jul 2011, 20:36
Skype:
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon ClaraFall » Mi 23. Mai 2012, 06:39

Hallo Lieber schnulli2,

Skript-Fu ist zwar total Klammersüchtig, aber allzuviel ist eben doch manchmal ungesund.
Nach einer sich öffnenden Klammer erwartet Skript-Fu eine Funktion oder einen Funktionsnamen.
Wenn Du schreibst (EbeneListID), dann glaubt das Skript, das wäre ein Funktionsaufruf.
Allerdings ist es nur eine Variable.
Du hast also völlig recht, es ist ein Klammerproblem, kommt übrigens mehrmals vor.

Noch mal kurz zu gimp-display-new.
Wenn ein Bild NEU erstellt wird,
z.B. mit gimp-image-new oder gimp-image-duplicate,
dann existiert davon noch keine Ansicht,
sie muß also mit gimp-display-new neu angelegt werden.
(das passiert wirklich manchmal in meinen Skripts)

Wird auf einem bereits vorhandenem Bild etwas geändert,
dann macht gimp-displays-flush diese Änderung sichtbar.


Liebe Grüße
Clara

Benutzeravatar
schnulli2
Beiträge: 64
Registriert: So 29. Aug 2010, 22:34
Skype:
Wohnort: Elsdorf, Rhein-Erft-Kreis
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon schnulli2 » Mi 23. Mai 2012, 14:59

Ich habe das Script überarbeitet.
Die Vordergrundfarbe ist nach dem Benutzen des Scriptes auch wieder zurückgestellt.

Die Datei ist gezipt und liegt auf dem Ressourcen WebSpace.
Hier der Link dazu: http://www.web-zelios-program.info/mysql-login/upload/zentrierung.zip

Puh, das war schon etwas schwieriger. Aber ich habe es geschafft.
Die Erweiterung des Scrptes zum Einfügen und Zentrieren neuer Textebenen ist in Planung.

:kniefall: Vielen Dank an ClaraFall für die Unterstützung und Anregung, Magst du dafür nen :sekt: oder :wein: oder :kaffee:

Ich werde in naher Zukunft den ersten Beitrag editieren und dort die Beschreibung ergänzen. Natürlich mit Bebilderung.
schnulli2 's Galerie findet man hier

Benutzeravatar
do-se
Beiträge: 4700
Registriert: Mi 7. Apr 2010, 19:48
Skype:
Wohnort: bei München
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon do-se » Mi 23. Mai 2012, 22:06

Hallo schnulli

Das klappt ja schon prächtig. :spitze:
Habe mir dein Script gleich mal abgeholt. :clap:

Zwei kleine Anmerkungen.
Der Filteraufruf "eigenen scripte" sollte für die Allgemeinheit noch angepasst werden.
Sonst sprengt es mir irgendwann meine Kopfzeile. ;)

Neue Ebene und zentrieren wird perfekt ausgeführt, hat aber keinen Alphakanal.

Nur so Anregung, nicht bös gemeint. Ich verfolge deine Fortschritte mit viel Freude. :D
#
Galerie alt und Galerie neu
Hier gibt es unsere selbstgebastelten Smileys
Bild

Benutzeravatar
schnulli2
Beiträge: 64
Registriert: So 29. Aug 2010, 22:34
Skype:
Wohnort: Elsdorf, Rhein-Erft-Kreis
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon schnulli2 » Mi 23. Mai 2012, 22:33

Vielen Dank für deine Kritik, do-se.

An den Alphakanal für die neue Ebene habe ich gar nicht gedacht.
Mal sehen, wie ich das anpassen kann. Zur Not kann man über den Reiter Ebenen diesen von Hand einfügen :pfeif:

Der Ordner eigene Scripte kann in der scm-Datei angepasst werden.
Mir ist schon klar, dass viele Programmierer immer neue Ordnernamen finden und dann die Kopfzeile immer länger wird.
Werde mal schauen, wie die anderen das handhaben, Dann kann ich mich anpassen.

Im übrigen verstehe ich nicht, wie man deinen Post als "Böse" auffassen kann. Lässt man keine Kritik zu, stoppt die Weiterentwicklung des Scriptes.
Und das will doch bestimmt keiner. :pfeif:

edit: Das Anpassen mit dem Alphakanal ist einfach: Die neue Ebene muß nur als RGBA-IMAGE erstellt werden.
Das Einordnen in der Kopfzeile ist schwieriger. Ich würde das gerne im Menü Filter mit einordnen. Das klappt aber noch nicht, weil ich die Originalbezeichnung des Menüpunktes nicht kenne.
schnulli2 's Galerie findet man hier

ClaraFall
Beiträge: 99
Registriert: Di 5. Jul 2011, 20:36
Skype:
Kontaktdaten:

Re: Wie zentriert man Ebenen auf Bildern?

Beitragvon ClaraFall » Do 24. Mai 2012, 16:38

Hallo Lieber schnulli2,

Dein Skript ist jetzt also so weit fertig, daß ich es verreißen darf, ;)
dann will ich Dich auch nicht allzulange warten lassen.

Es ist Super-Genial, wie Du "vector-ref" benutzt.
Dadurch bekommst Du Zugriff auf jedes einzelne Element der Liste, ohne sie zu verändern.
Ebenfalls gefallen, hat mir die Abfrage, ob die aktuelle Ebene bereits die unterste Ebene ist.
Das ist schon mal Klasse, das hast Du prima hinbekommen!!!

Einige weitere konstruktive Anregungen, möchte ich Dir aber trotzdem nicht vorenthalten:

    Werf dieses "Keine" raus!!!
    Wenn ich KEINE Zentrierung vornehmen möchte, dann starte ich das Skript eben nicht.
    Und sollte ich es doch einmal starten, kann ich es immer noch abbrechen.
    Sonst könntest Du auch noch weitere Menüpunkte einfügen, wie:
    "Jetzt mache ich nichts", "Hier passiert gar nichts", "Zentriere doch mit der Maus" usw. usf.
    Das mag ja vielleicht lustig sein, noch dazu wo bei allen das Gleiche passiert, nämlich nichts,
    aber Skripte programmieren, die NICHTS machen, über das Stadium bist Du doch schon weit hinaus.
    Wenn ich eine neue Ebene erstelle und sie auf die aktuelle Ebene zentriere,
    dann bekomme ich auch meine Vordergrundfarbe wieder.
    Wenn ich eine neue Ebene allerdings auf das Bild zentriere, schlägt wieder der Farbklauer zu.
    Du hast auch noch eine Menge Redundanz im Skript.
    Z.B. hast Du zweimal die Befehle zum Anlegen einer neuen Ebene verwendet.
    Das bedeutet doppelten Wartungsaufwand.
    Wenn Du an einer Stelle etwas änderst, mußt Du es bei der anderen auch machen.
    (Farbe zurücksetzen, Alphakanal setzen (gimp-layer-add-alpha)) usw.
    Erstell doch zuerst die Ebene (wenn eine erstellt werden soll) und prüfe erst dann,
    worüber sie zentriert werden soll.
    So ist jede weitere Veränderung der neuen Ebene immer nur einmal nötig.

Ansonsten ist das Skript schon sehr gelungen. :super:

Danke auch für die Getränke, ich nehme sie in genau der Reihenfolge. :dank:


Liebe Grüße
Clara


Zurück zu „Scripte und Filter/Plugins“



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste