flashnfantasy
25.05.2004, 19:08
Mit den folgenden Script habe ich eine ganze Reihe von Copy/Paste Problemen erschlagen.
http://www.forum35.de/photo/tt.jpg
1. Auswahl aus einem Bild in ein neues Image, dabei über alle sichtbaren Ebenen gehen.
2. Auswahl aus einem Bild in ein neues Image, dabei über alle sichtbaren Ebenen gehen und die sichtbaren Ebenen nebeneinander anordnen.
3. Auswahl in ein bestehendes anderes Bild kopieren. Auch hier kann über alle sichtbaren Ebenen gegangen werden.
4. Auswahl an ein bestehendes Bild rechts oder unten anhängen, dabei das Bild skalieren auf die Größe des Zielbildes.
Auch wenn ich den Script ziemlich robust gebaut habe, so hapert es ein wenig mit dem Alpha...
Vorallem lassen sich so sehr einfach Collagen zusamensetzen.
Das Anleitungsbild oben habe ich zB. mit Hilfe dieses Scriptes sehr schnell erstellt.
Hoffe, ihr findet den Script genau so genial wie ich ;-)
Würde mich über Feed-Back freuen
(define (copysel img drawable copy-img copy-how copy-what)
(gimp-undo-push-group-start img)
(if (= img copy-img) (set! copy-how 0))
(set! selection-bounds (gimp-selection-bounds img))
(set! select-offset-x (cadr selection-bounds))
(set! select-offset-y (caddr selection-bounds))
(set! selection-width (- (cadr (cddr selection-bounds)) select-offset-x))
(set! selection-height (- (caddr (cddr selection-bounds)) select-offset-y))
(set! draw-type (car (gimp-drawable-type-with-alpha drawable)))
(set! image-type (car (gimp-image-base-type img)))
(set! new-image copy-img)
(if (= 0 copy-how)
(begin
(set! new-image (car (gimp-image-new selection-width selection-height image-type)))
(set! display-work (car (gimp-display-new new-image)))
))
(gimp-undo-push-group-start new-image)
(set! img_width (car (gimp-image-width new-image)))
(set! img_height (car (gimp-image-height new-image)))
(set! old_width (car (gimp-image-width img)))
(set! old_height (car (gimp-image-height img)))
(set! layers (gimp-image-get-layers img))
(set! num-of-layers (car layers))
(set! index num-of-layers)
(set! layers-list (cadr layers))
(while (< 0 index)
(set! index (- index 1))
(set! layer (aref layers-list index))
(set! make-a-copy 1)
(if (and (= copy-what 0) (not (= layer drawable)))
(set! make-a-copy 0)
)
(set! layer-vis (car (gimp-drawable-get-visible layer)))
(if (= layer-vis FALSE)
(set! make-a-copy 0)
)
(if (= make-a-copy 1)
(begin
(gimp-selection-none img)
(gimp-selection-clear img)
(gimp-layer-set-preserve-trans layer TRUE)
(gimp-selection-all img)
(set! offs-x (car (gimp-drawable-offsets layer)))
(set! offs-y (cadr (gimp-drawable-offsets layer)))
(set! size-x (car (gimp-drawable-width layer)))
(set! size-y (car (gimp-drawable-height layer)))
; berechnen des tatsächlich kopierten Ausschnittes
(set! offsmx offs-x)
(if (< offsmx 0) (set! offsmx 0))
(set! sizemx (+ size-x offs-x))
(if (< old_width sizemx) (set! sizemx old_width))
(set! sizemx (- sizemx offsmx))
(set! offsmy offs-y)
(if (< offsmy 0) (set! offsmy 0))
(set! sizemy (+ size-y offs-y))
(if (< old_height sizemy) (set! sizemy old_height))
(set! sizemy (- sizemy offsmy))
(gimp-edit-copy layer)
(set! new_width selection-width)
(set! new_height selection-height)
(if (= copy-what 2)
(begin
(set! img_width (car (gimp-image-width new-image)))
(set! img_height (car (gimp-image-height new-image)))
))
(set! scaleX (/ img_width new_width))
(set! scaleY (/ img_height new_height))
(set! layer-mode (car (gimp-layer-get-mode layer)))
(set! new-draw (car (gimp-layer-new new-image (car (gimp-image-width img)) (car (gimp-image-height img)) draw-type "Selection" 100 layer-mode)))
(gimp-image-add-layer new-image new-draw 0)
(gimp-selection-none new-image)
(gimp-drawable-fill new-draw 3)
(gimp-edit-clear new-draw)
(gimp-selection-clear new-image)
(set! floating-sel (car (gimp-edit-paste new-draw FALSE)))
(gimp-floating-sel-anchor floating-sel)
(set! halfx (/ (- old_width sizemx) 2))
(set! halfy (/ (- old_height sizemy) 2))
(gimp-layer-set-offsets new-draw (- (- offsmx halfx) select-offset-x) (- (- offsmy halfy) select-offset-y))
(gimp-layer-resize new-draw selection-width selection-height (- (- offsmx halfx) select-offset-x) (- (- offsmy halfy) select-offset-y))
;(gimp-layer-resize new-draw sizemx sizemy (- (- 0 halfx) select-offset-x) (- (- 0 halfy) select-offset-y))
(if (= copy-how 1)
(begin
(gimp-layer-scale new-draw (* new_width scaleY) (* new_height scaleY) TRUE)
(gimp-layer-set-offsets new-draw img_width 0)
(gimp-image-resize new-image (+ img_width (* new_width scaleY)) img_height 0 0)
))
(if (= copy-how 2)
(begin
(gimp-layer-scale new-draw (* new_width scaleX) (* new_height scaleX) TRUE)
(gimp-layer-set-offsets new-draw 0 img_height)
(gimp-image-resize new-image img_width (+ img_height (* new_height scaleX)) 0 0)
))
(if (= copy-how 3)
(begin
(gimp-layer-set-offsets new-draw img_width 0)
(gimp-image-resize new-image (+ img_width new_width) img_height 0 0)
))
(if (= copy-how 4)
; do nothing
)
(if (= copy-how 0)
; Macht aus mehreren Ebenen eine neue Bildstrecke
(if (= 2 copy-what) (set! copy-how 1))
)
(gimp-drawable-set-visible new-draw layer-vis)
))
)
(gimp-rect-select img select-offset-x select-offset-y selection-width selection-height 2 0 0)
(gimp-displays-flush)
(gimp-image-clean-all img)
(gimp-image-undo-group-end img)
(gimp-image-undo-group-end new-image)
)
(script-fu-register "copysel"
"<Image>/Script-Fu/Selection/To Image Improved"
"Kopiert alle Ebenen in ein neues Image oder haengt es an ein anderes Image an. Soll vorallem das Zusammenfuegen von Bildern erleichtern. Wird ein Bereich aus dem Sourceimage ausgewaehlt, so wird der umfassende rechteckige Bereich verarbeitet. P1: Sourceimage, P2: Layer, nur interessant, wenn p5 auf 0 steht, P3: Targetimage, nur von interesse, wenn p4 groesser 0, P4: Methode, mit der das Sourceimage an das Targetimage angehaengt werden kann - 0=neues Image, 1=rechts an das Image, Feld wird skaliert, 2=unter das Image, Feld wird skaliert, 4=ueber das Image, unskaliert, ist sinnvoll, wenn Elemente von einem Image in ein Anderes kopiert werden sollen."
"Mathias"
"Mathias"
"16/05/04 (absolute Alpha-Version)"
"RGB*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
SF-IMAGE _"To Image" 0
SF-OPTION _"new Image" ' (_"new image"
_"right of image, scaled"
_"below of image, scaled"
_"right of image, unscaled"
_"over image"
)
SF-OPTION _"copy what" ' (_"layer only"
_"all visible layers stacked"
_"all visible layers spread"
)
)
http://www.forum35.de/photo/tt.jpg
1. Auswahl aus einem Bild in ein neues Image, dabei über alle sichtbaren Ebenen gehen.
2. Auswahl aus einem Bild in ein neues Image, dabei über alle sichtbaren Ebenen gehen und die sichtbaren Ebenen nebeneinander anordnen.
3. Auswahl in ein bestehendes anderes Bild kopieren. Auch hier kann über alle sichtbaren Ebenen gegangen werden.
4. Auswahl an ein bestehendes Bild rechts oder unten anhängen, dabei das Bild skalieren auf die Größe des Zielbildes.
Auch wenn ich den Script ziemlich robust gebaut habe, so hapert es ein wenig mit dem Alpha...
Vorallem lassen sich so sehr einfach Collagen zusamensetzen.
Das Anleitungsbild oben habe ich zB. mit Hilfe dieses Scriptes sehr schnell erstellt.
Hoffe, ihr findet den Script genau so genial wie ich ;-)
Würde mich über Feed-Back freuen
(define (copysel img drawable copy-img copy-how copy-what)
(gimp-undo-push-group-start img)
(if (= img copy-img) (set! copy-how 0))
(set! selection-bounds (gimp-selection-bounds img))
(set! select-offset-x (cadr selection-bounds))
(set! select-offset-y (caddr selection-bounds))
(set! selection-width (- (cadr (cddr selection-bounds)) select-offset-x))
(set! selection-height (- (caddr (cddr selection-bounds)) select-offset-y))
(set! draw-type (car (gimp-drawable-type-with-alpha drawable)))
(set! image-type (car (gimp-image-base-type img)))
(set! new-image copy-img)
(if (= 0 copy-how)
(begin
(set! new-image (car (gimp-image-new selection-width selection-height image-type)))
(set! display-work (car (gimp-display-new new-image)))
))
(gimp-undo-push-group-start new-image)
(set! img_width (car (gimp-image-width new-image)))
(set! img_height (car (gimp-image-height new-image)))
(set! old_width (car (gimp-image-width img)))
(set! old_height (car (gimp-image-height img)))
(set! layers (gimp-image-get-layers img))
(set! num-of-layers (car layers))
(set! index num-of-layers)
(set! layers-list (cadr layers))
(while (< 0 index)
(set! index (- index 1))
(set! layer (aref layers-list index))
(set! make-a-copy 1)
(if (and (= copy-what 0) (not (= layer drawable)))
(set! make-a-copy 0)
)
(set! layer-vis (car (gimp-drawable-get-visible layer)))
(if (= layer-vis FALSE)
(set! make-a-copy 0)
)
(if (= make-a-copy 1)
(begin
(gimp-selection-none img)
(gimp-selection-clear img)
(gimp-layer-set-preserve-trans layer TRUE)
(gimp-selection-all img)
(set! offs-x (car (gimp-drawable-offsets layer)))
(set! offs-y (cadr (gimp-drawable-offsets layer)))
(set! size-x (car (gimp-drawable-width layer)))
(set! size-y (car (gimp-drawable-height layer)))
; berechnen des tatsächlich kopierten Ausschnittes
(set! offsmx offs-x)
(if (< offsmx 0) (set! offsmx 0))
(set! sizemx (+ size-x offs-x))
(if (< old_width sizemx) (set! sizemx old_width))
(set! sizemx (- sizemx offsmx))
(set! offsmy offs-y)
(if (< offsmy 0) (set! offsmy 0))
(set! sizemy (+ size-y offs-y))
(if (< old_height sizemy) (set! sizemy old_height))
(set! sizemy (- sizemy offsmy))
(gimp-edit-copy layer)
(set! new_width selection-width)
(set! new_height selection-height)
(if (= copy-what 2)
(begin
(set! img_width (car (gimp-image-width new-image)))
(set! img_height (car (gimp-image-height new-image)))
))
(set! scaleX (/ img_width new_width))
(set! scaleY (/ img_height new_height))
(set! layer-mode (car (gimp-layer-get-mode layer)))
(set! new-draw (car (gimp-layer-new new-image (car (gimp-image-width img)) (car (gimp-image-height img)) draw-type "Selection" 100 layer-mode)))
(gimp-image-add-layer new-image new-draw 0)
(gimp-selection-none new-image)
(gimp-drawable-fill new-draw 3)
(gimp-edit-clear new-draw)
(gimp-selection-clear new-image)
(set! floating-sel (car (gimp-edit-paste new-draw FALSE)))
(gimp-floating-sel-anchor floating-sel)
(set! halfx (/ (- old_width sizemx) 2))
(set! halfy (/ (- old_height sizemy) 2))
(gimp-layer-set-offsets new-draw (- (- offsmx halfx) select-offset-x) (- (- offsmy halfy) select-offset-y))
(gimp-layer-resize new-draw selection-width selection-height (- (- offsmx halfx) select-offset-x) (- (- offsmy halfy) select-offset-y))
;(gimp-layer-resize new-draw sizemx sizemy (- (- 0 halfx) select-offset-x) (- (- 0 halfy) select-offset-y))
(if (= copy-how 1)
(begin
(gimp-layer-scale new-draw (* new_width scaleY) (* new_height scaleY) TRUE)
(gimp-layer-set-offsets new-draw img_width 0)
(gimp-image-resize new-image (+ img_width (* new_width scaleY)) img_height 0 0)
))
(if (= copy-how 2)
(begin
(gimp-layer-scale new-draw (* new_width scaleX) (* new_height scaleX) TRUE)
(gimp-layer-set-offsets new-draw 0 img_height)
(gimp-image-resize new-image img_width (+ img_height (* new_height scaleX)) 0 0)
))
(if (= copy-how 3)
(begin
(gimp-layer-set-offsets new-draw img_width 0)
(gimp-image-resize new-image (+ img_width new_width) img_height 0 0)
))
(if (= copy-how 4)
; do nothing
)
(if (= copy-how 0)
; Macht aus mehreren Ebenen eine neue Bildstrecke
(if (= 2 copy-what) (set! copy-how 1))
)
(gimp-drawable-set-visible new-draw layer-vis)
))
)
(gimp-rect-select img select-offset-x select-offset-y selection-width selection-height 2 0 0)
(gimp-displays-flush)
(gimp-image-clean-all img)
(gimp-image-undo-group-end img)
(gimp-image-undo-group-end new-image)
)
(script-fu-register "copysel"
"<Image>/Script-Fu/Selection/To Image Improved"
"Kopiert alle Ebenen in ein neues Image oder haengt es an ein anderes Image an. Soll vorallem das Zusammenfuegen von Bildern erleichtern. Wird ein Bereich aus dem Sourceimage ausgewaehlt, so wird der umfassende rechteckige Bereich verarbeitet. P1: Sourceimage, P2: Layer, nur interessant, wenn p5 auf 0 steht, P3: Targetimage, nur von interesse, wenn p4 groesser 0, P4: Methode, mit der das Sourceimage an das Targetimage angehaengt werden kann - 0=neues Image, 1=rechts an das Image, Feld wird skaliert, 2=unter das Image, Feld wird skaliert, 4=ueber das Image, unskaliert, ist sinnvoll, wenn Elemente von einem Image in ein Anderes kopiert werden sollen."
"Mathias"
"Mathias"
"16/05/04 (absolute Alpha-Version)"
"RGB*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
SF-IMAGE _"To Image" 0
SF-OPTION _"new Image" ' (_"new image"
_"right of image, scaled"
_"below of image, scaled"
_"right of image, unscaled"
_"over image"
)
SF-OPTION _"copy what" ' (_"layer only"
_"all visible layers stacked"
_"all visible layers spread"
)
)