PDA

Vollständige Version anzeigen : Lösungsansatz zwei Bilder zu kombinieren über Script-Fu


klaus_harrer
21.05.2004, 11:34
Hallo

Ich habe im Forum gelesen das es noch kein Script gibbt das zwei Bilder zu eins verschmelzen kann. Ich habe ein Script geschrieben das einen Lösungsansatz bietet aber sicherlich noch nicht perfekt ist. Dieses Script können auch Windows user nutzen da es ein Script-Fu geschreiben ist.

(define (script-fu-image-combine file_1 file_2 interleave background-color)

(set! img0 (car (gimp-file-load 1 file_1 file_1)))
(set! img0-layer(car (gimp-image-get-active-drawable img0)))
(set! img1 (car (gimp-file-load 1 file_2 file_2)))
(set! img1-layer(car (gimp-image-get-active-drawable img1)))
(set! width0 (car (gimp-image-width img0)))
(set! width1 (car (gimp-image-width img1)))
(set! height0 (car (gimp-image-height img0)))
(set! height1 (car (gimp-image-height img1)))
(set! img-interleave(* interleave 2))
(set! new-width (+ width0 width1(- img-interleave)))
(set! new-image (car (gimp-image-new new-width height0 RGB)))
(set! layer0 (car (gimp-layer-new new-image new-width height0 RGB-IMAGE "Background" 100 NORMAL-MODE)))
(gimp-image-add-layer new-image layer0 0)
(gimp-palette-set-background background-color)
(gimp-edit-fill layer0 BACKGROUND-FILL)
(set! layer1 (car (gimp-layer-new new-image width0 height0 RGB-IMAGE "first layer" 100 NORMAL-MODE)))
(gimp-image-add-layer new-image layer1 -1)
(gimp-edit-copy img0-layer)
(set! floating-sel (car (gimp-edit-paste layer1 FALSE)))
(gimp-floating-sel-anchor floating-sel)
(gimp-layer-add-alpha layer1)
(set! mask (car (gimp-layer-create-mask layer1 ADD-WHITE-MASK)))
(gimp-layer-add-mask layer1 mask)
(set! layer2 (car (gimp-layer-new new-image width1 height1 RGB-IMAGE "second layer" 100 NORMAL-MODE)))
(gimp-image-add-layer new-image layer2 -1)
(gimp-edit-copy img1-layer)
(set! floating-sel1 (car (gimp-edit-paste layer2 FALSE)))
(gimp-floating-sel-anchor floating-sel1)
(gimp-layer-add-alpha layer2)
(gimp-layer-set-offsets layer2 (- width0 img-interleave) 0)
(set! mask1 (car (gimp-layer-create-mask layer2 ADD-WHITE-MASK)))
(gimp-layer-add-mask layer2 mask1)
(gimp-palette-set-foreground '(0 0 0))
(gimp-palette-set-background '(255 255 255))
(gimp-edit-blend mask FG-BG-RGB-MODE NORMAL-MODE GRADIENT-LINEAR 100 REPEAT-NONE 0 0 0 0 0 0 width0 0 (- width0 img-interleave) 0)
(gimp-edit-blend mask1 FG-BG-RGB-MODE NORMAL-MODE GRADIENT-LINEAR 100 REPEAT-NONE 0 0 0 0 0 0 0 0 img-interleave 0)
(gimp-layer-remove-mask layer1 0)
(gimp-layer-remove-mask layer2 0)
(gimp-image-merge-visible-layers new-image 2)
(gimp-display-new new-image)

)
(script-fu-register
"script-fu-image-combine"
"<Toolbox>/Xtns/Script-Fu/Misc/Image combine..."
"combine two Image at one"
"Klaus Harrer"
"copyright 2004, Klaus Harrer"
"May 15, 2004"
""
SF-FILENAME _"file1" ""
SF-FILENAME _"file2" ""
SF-VALUE _"interleave" "50"
SF-COLOR _"Background Color" '(255 255 255)
)




Der Dialog:
interleave=> Überlappung der zu verschmelzenen Bilder
Hintergrund => die Hintergrundfarbe des enstehenden Bildes

http://home.arcor.de/klaus_harrer/Grafiken/gimp/img_com_dia.png

das Ergebnis:

http://home.arcor.de/klaus_harrer/Grafiken/gimp/img_com_erg.png


MfG

Klaus[/code]

klaus_harrer
31.05.2004, 10:39
Hallo

Wäre schön wenn einer ein Feedback geben könnte(völlig unbrauchbar, was noch verbessert werden könnte u.s.w)

MfG
Klaus

Wulf
31.05.2004, 12:17
Jaja, ich mach ja schon.
Wenn ich das jetzt richtig deute soll das Script zwei Bilder überlappen und ineinanderblenden, oder?
Bei mir legts die Bilder nebeneinander bei 50 und 100 interleave und gibt mir eine Fläche in der Hintergrundfarbe bei 0.
Auf der anderen Seite versteh ich auch nicht ganz den Sinn der Übung, kannst du mir sagen wozu du das brauchst?

eRin
31.05.2004, 18:44
Hab das Skript heute morgen mit 2 Wallpapers getestet, hat ohne Probs gefunzt, Nice Work :)

Ein nettes Feature wäre vielleicht noch den Winkel der überschneidung frei bestimmen zu können.

klaus_harrer
31.05.2004, 22:36
Hallo Wulf

Ich weiss jetzt garnicht was du meinst ,hast das Script überhaupt probiert.

Zweck:

Zwei Bilder zu eins verschmelzen . Sieht man manchmal auf Hompages als Header. Man kann die Überlappung und die Hintergrundfarbe bestimmen. Außerdem eine gute Übung in Script-Fu für mich.

MfG
Klaus

Rebell
01.06.2004, 08:27
Aber wo ist der Unterschied zu, wenn ich 2 Ebenen mit Alpha überblenden lasse?

Wulf
01.06.2004, 11:11
Ja ich habs probiert, hab ich oben auch geschrieben was passiert.
Dann kriegst du halt Screenshots.
Also ich mache das:
http://www.gimpforum.de/album_pic.php?pic_id=92
und bekomme das:
http://www.gimpforum.de/album_pic.php?pic_id=93
wobei die Bilder original recht groß sind weil sie unverändert aus 'ner Digitalkamera kommen, sind halt die ersten beiden in meinem Bilderverzeichniss.
Ich denke die Bilder sollten sich überlappen statt nebeneinander zu stehen, oder?

Aber wo ist der Unterschied zu, wenn ich 2 Ebenen mit Alpha überblenden lasse?
Der Unterschied besteht darin, dass man nicht sieht was man macht.
Deswegen würde ich das lieber von Hand machen, ist aber Geschmackssache. Das Script würde für mich erst dann Sinn machen wenn es das automatisch für 100 Bilder macht.
Als Übung ist's natürlich OK.

klaus_harrer
01.06.2004, 20:01
Hallo Wulf

Versteh ich nicht warum es bei dir nicht funktioniert. Ich habe mehrere Tests gemacht. Hat immer geklappt. Wenn es dir nichts ausmacht kannst du mir die Bilder per E-Mail schicken. Würde das gerne nachvollziehen.
Welche Gimp Version und welches Betriebssystem wäre auch von Iinteresse.

klaus_harrer@web.de

MfG
Klaus

spacepenguin
17.06.2004, 18:30
Schon eine Lösung gefunden? Bei mir setzt das Skript die Bilder auch nebeneinander. Habe Gimp 2.0.1 (Linux) und die Bilder sind jpgs und es ist egal, ob sie beide 2560x1920 oder z.B. 1280x960 groß sind.

klaus_harrer
04.07.2004, 15:54
Hallo

Ich ein wenig rumprobiert und zu folgenden Ergebnis in Form eines Script gekommen. Ich hoffe das funktioniert (das alte lief bei problemlos).

(define (script-fu-image-combine2 file_1 file_2 interleave)
;load first image
(set! img0 (car (gimp-file-load 1 file_1 file_1)))
(set! img0-layer(car (gimp-image-get-active-drawable img0)))
;load second image
(set! img1 (car (gimp-file-load 1 file_2 file_2)))
(set! img1-layer(car (gimp-image-get-active-drawable img1)))
; Values determine
(set! width0 (car (gimp-image-width img0)))
(set! width1 (car (gimp-image-width img1)))
(set! height0 (car (gimp-image-height img0)))
(set! height1 (car (gimp-image-height img1)))
; Values calculate
(set! new-width (+ width0 width1(- interleave)))
; new image
(set! new-image (car (gimp-image-new new-width height0 RGB)))

(set! layer0 (car(gimp-layer-new new-image new-width height0 RGB "First Layer" 100 NORMAL-MODE)))
(gimp-image-add-layer new-image layer0 0)
(gimp-edit-fill layer0 BACKGROUND-FILL)
(gimp-edit-copy img0-layer)
(set! floating-sel0 (car(gimp-edit-paste layer0 FALSE)))
(gimp-layer-set-offsets floating-sel0 0 0)
(gimp-floating-sel-anchor floating-sel0)
(set! layer1 (car(gimp-layer-new new-image width1 height1 RGB "Second Layer" 100 NORMAL-MODE)))
(gimp-image-add-layer new-image layer1 -1)
(gimp-edit-fill layer1 BACKGROUND-FILL)
(gimp-edit-copy img1-layer)
(set! floating-sel1 (car(gimp-edit-paste layer1 FALSE)))
(gimp-floating-sel-anchor floating-sel1)
(gimp-layer-set-offsets layer1 (- new-width width1) 0)
(gimp-layer-add-alpha layer1)
(set! mask (car(gimp-layer-create-mask layer1 ADD-WHITE-MASK)))
(gimp-layer-add-mask layer1 mask)
(gimp-palette-set-foreground '(0 0 0))
(gimp-palette-set-background '(255 255 255))
(gimp-edit-blend mask FG-BG-RGB-MODE NORMAL-MODE GRADIENT-LINEAR 100 REPEAT-NONE 0 0 0 0 0 0 0 0 interleave 0)
(gimp-layer-remove-mask layer1 0)
(gimp-image-merge-visible-layers new-image 2)
(gimp-display-new new-image)

)
(script-fu-register
"script-fu-image-combine2"
"<Toolbox>/Xtns/Script-Fu/Misc/Image combine2..."
"combine two Image at one"
"Klaus Harrer"
"copyright 2004, Klaus Harrer"
"May 15, 2004"
""
SF-FILENAME _"file1" ""
SF-FILENAME _"file2" ""
SF-VALUE _"interleave" "50"
)



Wäre für ein wenig Feedback dankbar.

MfG
Klaus

Wulf
04.07.2004, 20:15
Ja klar, dauert aber einen Moment, ich hab 'n bischen was zu tun.
Und ich hab bestimmt nicht mehr die gleiche Gimp-Version, ist also nur halb hilfreich.
Ich werde also das andere Script auch noch mal checken.

@wulf: Diesmal Bitte nicht vergessen deine aktuelle Gimp-Versionsnummer mitzuposten !!!

hl..
04.07.2004, 21:07
habe gerade beide scripts ausgeführt unter win xp mit gimp 2.0.2, gefällt mir:


1. script
http://www.hl-extra.de/img_combine1.jpg

2.script
http://www.hl-extra.de/img_combine2.jpg

Voreinstellung nicht geändert.

1.script mit interleave 220
http://www.hl-extra.de/img_combine1_220_weiss.jpg

flashnfantasy
07.07.2004, 13:44
Wozu brauchst du das zweite Blending ?
Eigentlich blendest du ja eine Ebene schon aus. Wenn du dann zb. bei der einen Ebene dann nur noch eine Opacity von 25% hast, dann brauchst du bei der anderen keine 75%, sondern kannst die 100% lassen.

Es könnte sogar sein, daß du ansonsten dann mit einem Trick es schaffst, daß kein Hintergrund sichtbar ist...

Wulf
07.07.2004, 15:30
Alles klar, geht jetzt auch bei mir.
Mit Gimp 2.0.2 und den selben Photos.

EvilDivel
01.11.2004, 10:56
Hab mal ne frage.
Arbeite seit längeren mit Paintshop und hab somit keine große ahnung vom GIMP selber, wo muss ich den script den bei GIMP einfügen?

klaus_harrer
01.11.2004, 12:25
Hallo EvilDivel

Das Script als "image-combine.scm" abspeichern.

Ich denke du nutzt Windows,und ich Linux.
Kann dir also nicht genau sagen wo deine Scripte liegen.

Suche auf deiner Festplatte nach Dateien die auf .scm enden und in dieses Verzeichnis kopierst du das Script.

MfG
Klaus

EvilDivel
01.11.2004, 14:10
Vielen dank ich denke mal das die Dateien in C:/Dokumente und Einstellungen/gimp oder so liegen werde einfach mal schauen :)


EDIT:
Hm angezeigt wirds aber wenn ich auf ok klicke bekomm ich folgendes.

http://www.final-fighters.de/css/error.jpg

klaus_harrer
01.11.2004, 21:07
Hallo

Ich habe das Script noch einmal ausprobiert. Es funktioniert unter Linux einwandfrei.
Kann auch ein Windows spezifisches Problem sein.
Aber eigentlich kann ich das nicht glauben. Sonst wurden sich schon einige Windows Benutzer beschweren das ,das Script nicht funktioniert.

MfG
Klaus

flashnfantasy
03.11.2004, 22:17
Unter Windoofs kann ich es dir sagen

../GIMP-2.0/share/gimp/2.0/scripts

Dort müssten dann schon eine Menge an Scripts stehen mit der Endung

.SCM

Bei mir lautet der vollständige Pfad

c:/Programme/GIMP-2.0/share/gimp/2.0/scripts

Wenn du den Installer benutzt hast, dürfte er genauso lauten...

schumaml
03.11.2004, 23:59
Kann auch ein Windows spezifisches Problem sein.

Fast - es ist ein Windows-Nutzer-spezifisches Problem.

EvilDivel
04.11.2004, 16:59
Hi, danke für eure Hilfe es funktioniert jetzt hab Gimp einfach nochmal neu Installiert. :lol:

Regino
02.09.2005, 14:32
Also irgendwie finde ich das nicht wo ist das denn und wie heißt das dann?

lox2eagle
02.09.2005, 19:13
...das steht jeweils am Ende des Skripts hinter script-fu-register.

Regino
02.09.2005, 19:34
Danke aber ich hatte es schon gefunden. :wink: