Skript-Fu: Bilder bearbeiten

Aus GIMPForum

Wechseln zu: Navigation, Suche
^ Inhaltsverzeichnis ^ If und While >>

Bestehende Bilder bearbeiten

In diesem Kapitel wirst du lernen, wie du ein bereits existierendes Bild per Skript verändern kannst. Die ursprüngliche Idee kommt aus diesem Tutorial von devvv. Das was in diesem Tutorial behandelt wird ist lediglich der Hochpassfilter, also Schritte 1 bis 3. Es kann bestimmt nicht schaden, wenn du diese ersten drei Schritte mal von Hand machst, damit du weisst, was du schlussendlich hier überhaupt skriptest.

Genug geschwafelt, fangen wir an.

Erstelle zuerst eine Funktion für den Hochpassfilter und schreibe dann auch gleich den Variablen-Bereich in die Funktion. Die Parameter, die der Funktion übergeben werden, kannst du noch weglassen.

(define (hochpass-filter)
    (let*
        (;------------------Variablendeklaration
        );------------------Variablendeklaration fertig
    )
)

Aus dem Tutorial weisst du, dass du das Hintergrundbild zweimal duplizierst. Daher weisst du, dass du auf jeden Fall zwei Variablen benötigst.

(let*
    (;------------------Variablendeklaration
        (varBWLayer
            (car
                (gimp-layer-new-from-drawable
                 sfDrawable
                 sfBild
                )
            )
        )
        (varGaussscherLayer
            (car
                (gimp-layer-new-from-drawable
                 sfDrawable
                 sfBild
                )
            )
        )
    );------------------Variablendeklaration fertig
)

Da wir in der Farbkurve mehrere Position benötigen (im Tutorial vier) brauchen wir eine Variable, in der alle Koordinaten gespeichert werden. Vielleicht werden dir als erstes Listen einfallen. Leider können für die Koordinaten keine Listen verwendet werden. Wenn du im Prozeduren-Browser den Begriff spline eingibst, wirst du als einzige Funktion (gimp-curves-spline) finden (das ist das Farbkurven-Werkzeug). Wenn du den letzten Parameter der Funktion anschaust, wirst du feststellen, dass er den Datentyp INT8ARRAY hat. Ein Array ist eine andere Form von aufgelisteten Elementen. Allerdings können in einem Int-Array nur Ganzzahlen gespeichert werden (Datentyp: INT32). Die 8 bedeutet wahrscheinlich 8bit, also Zahlen von 0 bis 255, sicher bin ich mir da aber nicht.

Wenn du dir die Beschreibung des Parameters anschaust, wirst du merken, dass die Position jedes Punktes der Kurve in zwei Werten gespeichert ist (X für horizontale Position; Y für vertikale Position). Da die Kurve vier Punkte hat, werden also insgesamt acht Werte benötigt.

Um nun ein Array zu erstellen erstellst du eine Variable und gibst ihr als Wert (make-vector 8 'byte). Das würde dann etwa so aussehen:

(varCoords (make-vector 8 'byte))

Achtung! Hier braucht es kein (car) um der Variable einen Wert zuzuweisen, da nur GIMP-eigene Funktionen Werte als Liste zurückgeben und (make-vector) keine GIMP-Funktion ist. Der Parameter 8 ist die Anzahl der Elemente und 'byte ist wahrscheinlich der Wertebereich. Ein Byte besteht aus acht Bit; ein Bit kann zwei Werte (0 oder 1) annehmen, zwei hoch acht gibt 256 (also von 0-255). Soweit so gut, das Array ist erstellt, allerdings enthält es noch keine Werte. Dazu gibt es die Funktion (vector-set!), welche wie folgt aufgebaut ist:

(
 vector-set! ;ist der Name der Funktion
 varName     ;ist der Name des Arrays
 X           ;ist der Index des Elements
 Y           ;ist der Wert des Elements
)

Um auf ein Element eines Arrays zuzugreifen verwendest du die Funktion (vector-ref):

(
 vector-ref  ;ist der Name der Funktion
 varName     ;ist der Name des Arrays
 X           ;ist der Index des gewünschten Elements
)

Kurze Erläuterung:

Im Gegensatz zu Listen erlauben Arrays nur einen Datentyp.

Die erste Zeile mit den grossen Zahlen sind die Werte, wie du sie bereits aus Listen kennst. Die zweite, hellere Zeile sind die Indizes; im Gegensatz zu Listen hat nun jedes Feld eine eigene Nummer. Die dritte Zeile ist der Name des Arrays.

Du kannst nun die Koordinaten in das Array folgendermaßen abfüllen.

);------------------Variablendeklaration fertig
(vector-set! varCoords 0 0)    ;X-Wert des ersten Punktes (untere linke Ecke)
(vector-set! varCoords 1 0)    ;Y-Wert des ersten Punktes
(vector-set! varCoords 2 113)
(vector-set! varCoords 3 47)
(vector-set! varCoords 4 146)    
(vector-set! varCoords 5 221)
(vector-set! varCoords 6 255)
(vector-set! varCoords 7 255)

Das ist eigentlich das einzig neue, was du an Funktionen wissen musst. Den Rest des Skripts solltest du eigentlich selbst schreiben können, wenn du die Grundlagen durchgearbeitet und auch verstanden hast.

 ;---------------------------Erstes Duplikat einfügen
 (gimp-image-add-layer                  
  sfBild                                
  varBWLayer                            
  -1                                    
 )                                      
 ;---------------------------Zweites Duplikat einfügen
 (gimp-image-add-layer                  
  sfBild                                
  varGaussscherLayer                    
  -1                                    
 )
 ;---------------------------Oberste Ebene aktivieren                                      
 (gimp-image-set-active-layer           
  sfBild                                
  varGaussscherLayer                    
 )                                      
 ;---------------------------Gaußscher Weichzeichner mit dem Wert 18 auf die oberste Ebene angewendet
 (plug-in-gauss                         
  RUN-NONINTERACTIVE                    
  sfBild                                
  varGaussscherLayer                    
  18                                    
  18                                    
  0  ;---0 steht für IIR                
 )                                      
 ;---------------------------Transparenz einstellen
 (gimp-layer-set-opacity                
  varGaussscherLayer                    
  50                                    
 )                                      
 ;---------------------------Farben invertieren
 (gimp-invert varGaussscherLayer)       
 ;---------------------------Oberste Ebene nach unten vereinen
 (set! varBWLayer                        
     (car                               
         (gimp-image-merge-down         
          sfBild                        
          varGaussscherLayer            
          CLIP-TO-BOTTOM-LAYER          
         )                              
     )                                  
 )                                      
 ;---------------------------Entsättigen
 (gimp-desaturate varBWLayer)           
 (gimp-curves-spline                    
  varBWLayer                            
  HISTOGRAM-VALUE                       
  8                                     
  varCoords                             
 )
 ;---------------------------Alle Anzeigen aktualisieren
 (gimp-displays-flush)

Nun kannst du die (let*) und (define)-Klammern noch schließen und die (script-fu-register)-Funktion aufrufen.

(script-fu-register
    "hochpass-filter"

Zuerst der Name der Funktion, die aufgerufen werden soll...

"Hochpassfilter"

dann der Name des Menüeintrags...

"Dupliziert die aktive Ebene und wendet auf das Duplikat einen Hochpassfilter an."

die Beschreibung des Skripts...

"Mohi"

als nächstes kommt der Autor...

"Du darfst dieses Skript verteilen und veraendern solange der Name des Autors nicht entfernt wird."

dann die Copyright-Infos und...

"17. April 2011"

das Datum.

"RGB*, GRAY*"

Hier sagst du GIMP, auf welche Bilder-Typen das Skript angewandt werden kann. Bei einem Skript, das ein neues Bild erstellt, lässt du die Gänsefüsschen einfach leer. Gültige Werte sind RGB, RGBA, GRAY, GRAYA, INDEXED und INDEXEDA. Das A nach den Ausdrücken bedeutet, dass das Skript auch auf Ebenen mit Alphakanal angewendet werden kann. Wenn du willst, dass dein Skript sowohl auf RGB als auch auf RGBA-Bilder angewendet werden kann, reicht es auch RGB* zu schreiben und wenn du alle Bildmodi erlauben willst, dann kannst du auch nur ein Sternchen schreiben.

    SF-IMAGE    ""  0
    SF-DRAWABLE ""  0
) 

Diese beiden Parameter sind nur bei verändernden Skripts notwendig. Sie sind nicht durch den Benutzer veränderbar; das Skript erhält dadurch bloss die ID der ausgewählten Ebene und des aktiven Bildes. Als Standardwert kann/muss immer 0 genommen werden. Vergiss nicht, dass du die beiden Parameter nun auch oben im (define) angeben musst.

Dann kommt zum Schluss noch die Funktion (script-fu-menu-register) um das Skript in einem Menü unterzubringen.

(script-fu-menu-register
    "hochpass-filter" ;-------Funktion, die gespeichert werden soll
    "<Image>/File"    ;-------Über welches Menü das Skript aufrufbar sein soll
)

Falls du noch nicht GIMP 2.6 verwendest, musst du beim Pfad anstatt <Toolbox> <Image> angeben. Der Rest ist genau gleich, wie bei anderen Skripts.

Komplettes Skript

^ Inhaltsverzeichnis ^ If und While >>
Persönliche Werkzeuge