PDA

Vollständige Version anzeigen : Auswahl umwandeln in Auswahl mit Seitenverhältniss


flashnfantasy
28.10.2007, 14:18
Eines meiner ältesten und trotzdem am häufigsten genutzten Scripts, ich war eigentlich sicher, daß es schon mal gepostet war (vor 4 Jahren).
Grund für den jetzigen Post ist die Umstellung nach 2.4.

Das Script wandelt eine beliebige Auswahl in eine Auswahl mit den vorgegebenen Seitenverhältniss um.
Hauptsächlich brauche ich das, um Ausschnitte aus einem Photo passgenau zuzuschneiden. Meist verschiebe ich dann den Ausschnitt, anschliessend schneide ich das Bild noch zu.


(script-fu-register "selection"
_"<Image>/Script-Fu/Selection/Selection-Fit"
"Makes the selection fit to a ratio. Or Make an horizontal/vertical stripe."
"Mathias Weitz"
"Mathias Weitz"
"18/07/03"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-OPTION _"Fit" '(_"Ratio Max"
_"Auto"
_"Ratio Min"
_"Exact"
_"Ratio Horizontal"
_"Ratio Vertical"
_"Horizontal"
_"Vertical")
SF-ADJUSTMENT _"X-Ratio" '(4 1 250 1 1 0 0)
SF-ADJUSTMENT _"Y-Ratio" '(3 1 250 1 1 0 0)
SF-OPTION _"Mask" '(_"None"
_"New Image"
_"White 75%"
_"Black 75%"
_"Black 25%")
SF-ADJUSTMENT _"New-Image Width\n0 = no Scaling" '(0 0 3000 100 100 0 0)
)

(define (selection inImage inLayer fit xrat yrat mask finalWidth)
(define select-bounds (gimp-selection-bounds inImage))
(define has-selection (car select-bounds))
; x1 und y1 sind die Startkoordinaten
; x2 und y1 sind die Endkoordinaten
(define x1 (cadr select-bounds))
(define y1 (caddr select-bounds))
(define x2 (cadr (cddr select-bounds)))
(define y2 (caddr (cddr select-bounds)))
(define theWidth (car (gimp-image-width inImage)))
(define theHeight (car (gimp-image-height inImage)))
(define ergImg inImage)
; Sprachgebrauch:
; OS ist die Originalselektion
; ZS ist die Zielselektion, also die Selektion, die man erzeugen will.
; B ist das Bild insgesamt
; x ist die HALBE!!! Breite der Selektion in Pixel
; y ist die HALBE!!! Höhe der Selektion in Pixel
;
; Es wird immer die andere Größe des kartesischen Koordinatensystems bestimmt,
; wenn man das korrekte Verhältniss haben will.
;
; dx = die Differenz zu x der ZS vom x der OS wenn man man y der OS als Grundlage nimmt.
; dy ebenso
; dxh = die Differenz zu x der ZS vom x des B wenn man man y des B als Grundlage nimmt.
; dyh ebenso
;
; die beiden folgenden Werte sind nur interessant für die automatische
; Auswahl, bei der das Verhältniss auch gekippt wird, wenn dadurch
; mehr Bild in die Auswahl kommt !!!
; dxha = die Differenz zu x der ZS vom x des B wenn man man x! des B als Grundlage nimmt.
; dyha ebenso
;
; dxm ist die halbe Breite, wenn man die Bildgröße als Maßstab nimmt
;

(define dx (/ (- (/ (* xrat (- y2 y1)) yrat) (- x2 x1)) 2))
(define dy (/ (- (/ (* yrat (- x2 x1)) xrat) (- y2 y1)) 2))
(define dxh (/ (- (/ (* xrat theHeight) yrat) (- x2 x1)) 2))
(define dyh (/ (- (/ (* yrat theWidth) xrat) (- y2 y1)) 2))
(define dxha (/ (- (/ (* yrat theHeight) xrat) (- x2 x1)) 2))
(define dyha (/ (- (/ (* xrat theWidth) yrat) (- y2 y1)) 2))
(define dxm (/ (/ (* xrat theHeight) yrat) 2))
(define dym (/ (/ (* yrat theWidth) xrat) 2))
(define nx1 x1)
(define nx2 x2)
(define ny1 y1)
(define ny2 y2)
(define mx (/ (+ x1 x2) 2))
(define my (/ (+ y1 y2) 2))

; ratio auto
(if (= fit 1)
(begin
(define s 1)
(if (and (and (<= (+ (- y2 y1) (* 2 dyh)) theHeight) (<= 0 dyh)) (= s 1))
(begin
(set! nx1 0)
(set! nx2 theWidth)
(set! ny1 (- ny1 dyh))
(set! ny2 (+ ny2 dyh))
(set! s 0)
))
(if (and (and (<= (+ (- x2 x1) (* 2 dxh)) theWidth) (<= 0 dxh)) (= s 1))
(begin
(set! ny1 0)
(set! ny2 theHeight)
(set! nx1 (- nx1 dxh))
(set! nx2 (+ nx2 dxh))
(set! s 0)
))
(if (and (and (<= (+ (- y2 y1) (* 2 dyha)) theHeight) (<= 0 dyha)) (= s 1))
(begin
(set! nx1 0)
(set! nx2 theWidth)
(set! ny1 (- ny1 dyha))
(set! ny2 (+ ny2 dyha))
(set! s 0)
))
(if (and (and (<= (+ (- x2 x1) (* 2 dxha)) theWidth) (<= 0 dxha)) (= s 1))
(begin
(set! ny1 0)
(set! ny2 theHeight)
(set! nx1 (- nx1 dxha))
(set! nx2 (+ nx2 dxha))
(set! s 0)
))
))

(if (= fit 6)
(begin
(set! nx1 0)
(set! nx2 theWidth)))

(if (= fit 7)
(begin
(set! ny1 0)
(set! ny2 theHeight)))

; ratio max
(if (= fit 0)
(begin
(if (< 0 dx)
(begin
(if (< (+ dx dx (- x2 x1)) theWidth)
(begin
(set! nx1 (- nx1 dx))
(set! nx2 (+ nx2 dx))
)
(begin
(set! nx1 0)
(set! nx2 theWidth)
(set! ny1 (- my dym))
(set! ny2 (+ my dym))
))
))
(if (< 0 dy)
(begin
(if (< (+ dy dy (- y2 y1)) theHeight)
(begin
(set! ny1 (- ny1 dy))
(set! ny2 (+ ny2 dy))
)
(begin
(set! ny1 0)
(set! ny2 theHeight)
(set! nx1 (- mx dxm))
(set! nx2 (+ mx dxm))
))
))
))

(if (= fit 2)
(begin
(if (< 0 dy)
(begin
(set! nx1 (- nx1 dx))
(set! nx2 (+ nx2 dx))))
(if (< 0 dx)
(begin
(set! ny1 (- ny1 dy))
(set! ny2 (+ ny2 dy))))
))

; exact fit
(if (= fit 3)
(begin
(set! nx1 (- (/ (+ nx1 nx2) 2) (/ xrat 2)))
(set! nx2 (+ nx1 xrat))
(set! ny1 (- (/ (+ ny1 ny2) 2) (/ yrat 2)))
(set! ny2 (+ ny1 yrat))
))

; horizontal ratio fit
(if (= fit 4)
(begin
(set! nx1 0)
(set! nx2 theWidth)
(set! ny1 (- ny1 dyh))
(set! ny2 (+ ny2 dyh))
))


; vertical ratio fit
(if (= fit 5)
(begin
(set! ny1 0)
(set! ny2 theHeight)
(set! nx1 (- nx1 dxh))
(set! nx2 (+ nx2 dxh))
))



(if (< theWidth nx2)
(begin
(set! nx1 (- nx1 (- nx2 theWidth)))
(set! nx2 theWidth)))
(if (< nx1 0)
(begin
(set! nx2 (- nx2 nx1))
(set! nx1 0)))
(if (< theHeight ny2)
(begin
(set! ny1 (- ny1 (- ny2 theHeight)))
(set! ny2 theHeight)))
(if (< ny1 0)
(begin
(set! ny2 (- ny2 ny1))
(set! ny1 0)))

(gimp-rect-select inImage
nx1
ny1
(- nx2 nx1)
(- ny2 ny1)
REPLACE
FALSE 0)

(if (= 1 mask)
(begin
; Neues Fenster

(define image-work (car (gimp-image-new (- nx2 nx1) (- ny2 ny1) RGB)))
;(gimp-image-undo-disable image-work)

(define image-new-layer (car (gimp-layer-new image-work (- nx2 nx1) (- ny2 ny1) RGB "Hintergrund" 100 NORMAL)))
(gimp-image-add-layer image-work image-new-layer 0)
(define display-work (car (gimp-display-new image-work)))
(gimp-edit-copy inLayer)
(gimp-selection-all image-work)
(gimp-layer-add-alpha image-new-layer)
(gimp-drawable-fill image-new-layer 3)
(gimp-edit-clear image-new-layer)
(gimp-selection-clear image-work)
(define floating_sel (car (gimp-edit-paste image-new-layer 0)))
(gimp-floating-sel-anchor floating_sel)
(if (< 0 finalWidth)
(gimp-image-scale image-work finalWidth (* (/ (- ny2 ny1) (- nx2 nx1)) finalWidth)))
(set! ergImg image-work)
))

(if (< 1 mask)
(begin
(define layerMask (car (gimp-layer-new inImage (car (gimp-image-width inImage)) (car (gimp-image-height inImage)) 1 "Maske" 90 0)))
(gimp-image-add-layer inImage layerMask 0)
(gimp-drawable-fill layerMask 2)
(gimp-edit-clear layerMask)
(if (= 3 mask)
(begin
(gimp-selection-invert inImage)
(gimp-levels layerMask 0 0 255 1 0 0)
(gimp-selection-invert inImage)
))
(if (= 4 mask)
(begin
(gimp-selection-invert inImage)
(gimp-levels layerMask 0 0 255 1 0 0)
(gimp-selection-invert inImage)
(gimp-layer-set-opacity layerMask 25)
))
))

(gimp-image-clean-all inImage)
(gimp-displays-flush)
(cons ergImg ())
)

;**************************