Sonntag, 6. März 2011

Gimp Hilfslinien und Abstandsmessung

Setzen wir in Gimp eine vertikale Hilfslinie an Position 10 und eine an Position 20 und messen wir die Strecke mit dem Maßband Werkzeug aus, dann erhalten wir als Abstand 20 - 10 = 10. Dieses Maß kann zum Einen als Anzahl Schritte betrachtet werden um von Pixelposition 10 auf Pixelposition 20 zu gelangen oder aber als Anzahl der horizontalen Pixel interpretiert werden, die Platz finden an den Positionen 10 bis 19. Mit der zweiten Interpretation wird klar, dass eine vertikale Hilfslinie immer dem Pixel zugeordnet wird dessen linke Seite sie berührt. Bei einer horizontalen Hilfslinie wird sie hingegen dem Pixel zugeordnet dessen obere Seite sie berührt. Man muss sich dabei die Pixel als quadratische Elemente vorstellen. Die Hilfslinien tangieren dabei die Pixel entweder von der linken oder oberen Seite und sind gegenüber den zweidimensionalen Pixeln eindimensional. Hilfslinien werden jedoch am Bildschirm gemeinsam mit den echten Pixeln eines Bildes in Pixeln dargestellt. Man kann daher "virtuelle" Pixel von Hilflinien und "reale" Pixel vom Bild nur bei sehr hoher Vergrößerung dadurch unterscheiden, dass Pixel vom Bild als rechteckige Flächen und Pixel von Hilfslinien als Linien dargestellt werden.


Wenn wir nun ein Bild haben, welches die Dimension (BxH) = 100x100 hat und wir eine zweite Ebene mit der Dimension 10x100 erstellen, die am rechten Rand der ersten Ebene endet, wo müssen wir dann Hilfslinien positionieren welche uns die Verschiebung der Ebene über die Eigenschaft "Magentische Hilfslinien" erlaubt? Die Antwort ist 100 für die vertikale Hilfslinie. Man beachte, dass Pixel 100 außerhalb der gültigen Bildpixel liegt; diese gehen von 0 bis 99. Da unsere Ebene mit Dimension 10x100 am rechten Rand unseres Bildes enden soll und wir wissen, dass vertikale Hilfslinien immer der linken Seite eines Pixels zugeordnet werden, können wir den rechtesten Rand unserer 10x100-Ebene als anliegend zum linken Rand des darauffolgenden Pixels betrachten. Dieser nächste Nachbarpixel hat die Position 100 und kann mit seiner linken Seite durch eine vertikale Hilfsline an Position 100 dargestellt werden. Als Ergebnis dieser Betrachtungen kommen wir nun zu der Frage, wie man ein gegebenes Bild richtig digital abmisst in Gimp. Am besten vergrößert man die Ansicht des Bildes soweit wie möglich mit der Nebenbedingung, dass der zu messende Bildausschnitt immer noch als ganzes auf dem Bildschirm ohne scrollen zu müssen zu sehen ist. Wir gehen davon aus, das wir von links nach rechts eine horizontale Strecke messen wollen; das Maßbandwerkzeug von Gimp ist aktiviert. Wir klicken mit der linken Maustaste den ersten Pixel der linken Seite des Bildes und halten den Mauszeiger gedrückt. Dann bewegen wir den Mauszeiger auf den dem rechtesten Pixel folgenden Pixel des Bildausschnitts und geben die Maustaste wieder frei. Dieser Abstand entspricht der Breite des Bildausschnitts in Pixeln. Da man das Ziehen und Loslassen mit der Maus unter Umständen nicht ganz sauber hinbekommt, kann man auch Hilfslinien an den Meßendpunkten anlegen und dann die Eigenschaft von "Magnetischen Hilfslinien" beim Messen ausnutzen.

Mittwoch, 2. März 2011

Gimp Script-FU / Scheme Programmierung

Scheme ist ein Lisp Dialekt. Neben Atomaren Ausdrücken wie z.B. 7, "asa" oder 'a gibt es Listen. Dabei sind literale Listen in der Schreibweise '(4 abtfd "asas" -15) zu notieren. Innerhalb einer Liste entfällt dieser Zwang mit Präfix '. Funktionsaufrufe sind ebenfalls in der Gestalt einer Liste zu notieren. Dabei wird die Präfixnotation angewendet: (+ 1 2 3 4) == 1+2+3+4. Man kann nun auch Funktionen definieren: (define (fn_name par1 par2 par3) (- (+ par1 par2) par3) ). Mit (let* ( (a 5) (b "skdjsd") ) (list a b) ) definiert man lokale Variablen, welche in der inneren Klammer in Ausdrücken verwendet werden können. Es gibt die Listenfunktionen (car '( 1 2 3) ) == 1 und (cdr '(1 2 3) ) == (2 3). Diese können auch wiederholt angewendet abgekürzt werden: (car (cdr (1 2 3) ) ) == (cadr (1 2 3) ) == 2. Diese abkürzende Schreibweise geht aber nicht beliebig: Z.B. kann man nicht
(let* ((x '( (1 2 (3 4 5) 6) 7 8 (9 10) ) )) (caar (cddar x)) ) == 3 mit (let* ((x '( (1 2 (3 4 5) 6) 7 8 (9 10) ) )) (caaddar x) ) abkürzen.

Eine Funktion registriert man in gimp über (script-fu-register "fn_name"
"mandatoryField_1"
"mandatoryField_2"
"mandatoryField_3"
"mandatoryField_4"
"mandatoryField_5"
"mandatoryField_6"
SF-IMAGE "Image" 0; Von Gimp mit aktuellem Bild besetzt
SF-DRAWABLE "Drawable" 0; Von Gimp mit Canvas besetzt
SF-STRING "TextFieldLabel" "initValue"; Eingabefeld in GUI
SF-TOGGLE "CheckboxLabel" TRUE; Checkbox in GUI
)
Dabei werden die "SF-" Eingabefelder in der Reihenfolge ihrer Aufzählung den formalen Paramtern der funktion fn_name zugeordnet:
(define (fn_name par1 par2 par3 par4? ) (beliebiger_code1) (beliebiger_code2) ). Man beachte, dass bei par4? das ? Bestandteil des Namens ist. Also entspricht par1 dem Typ SF-IMAGE usw.

http://docs.gimp.org/de/gimp-using-script-fu-tutorial.html
http://www.scheme.com/tspl2d/index.html
Vergleich Scheme und Lisp