#!/opt/bin/perl # Daß Xach (ein sehr bekannter Gimp-Maintainer) die Welt um sich herum # etwas anders wahrnimmt als andere, befürchteten viele. Und das schon # sehr lange. Aber dies hat alle überrascht. Terminator 77? use Gimp qw(:auto __ N_); use Gimp::Fu; # Dieses Plugin verändert das Aussehen einer Ebene so, daß es dem Bild # einer schlechten Kamera sehr nahe kommt (einfarbig mit Streifen). register "xachvision", "Xach Surveillance Camera/XachVision", "This makes an interlaced-looking machine vision type thing.", "Seth Burgess", "Seth Burgess ", "2000-11-25", N_"/Filters/Noise/Xach Vision...", "RGB*, GRAY*", [ # Das Skript hat zwei Parameter: Die Farbe, in der das Bild # eingefärbt werden soll, und die Menge an Rauschen, die # die Qualität des Bildes herabsetzt. [PF_COLOR, "color", "What Color to see the world in", [0, 255, 0]], [PF_SLIDER, "added_noise", "How much noise to add", 25, [0,255,5]] ], sub { my($img,$drawable,$color,$amt) =@_; # Das Plugin macht sehr viele Modifikationen. Damit nicht jede # davon einen Undo-Schritt benötigt, werden alle Veränderungen # in diesem Skript in einer Undo-Gruppe, d.h. einem Undo-Schritt, # zusammengefaßt. $img->undo_push_group_start; # Das Skript ist etwas älter und benutzt vorwiegend die Funktions- # Syntax und nicht die Methoden-Syntax. Außerdem wird der volle Name # jeder Methode benutzt. Statt "gimp_layer_copy" könnte man z.B. # einfach nur "copy" benutzen, da Gimp-Perl weiß, das eine # "gimp_layer_*"-Methode nur auf Ebenen angewendet werden kann. # Sichere die alte Hintergrundfarbe. Ändert man diese willkürlich, # wird der Benutzer böse! $oldbackground = gimp_palette_get_background(); # Das Plugin erzeugt zwei zusätzliche Ebenen, indem es die Ebene # zweimal kopiert und dem Bild hinzufügt. $midlayer = $drawable->gimp_layer_copy(1); $img->add_layer($midlayer, 0); $toplayer = $drawable->gimp_layer_copy(1); $img->add_layer($toplayer, 0); # Nun wird die vorderste Ebene ganz in der gewünschten Farbe gefüllt. # Der Kombinationsmodus wird auf COLOR gesetzt, was bewirkt, daß die # vorderste Ebene alle darunterliegenden Ebenen in der gewählten Farbe # einfärbt. Dies ist die einzige Funktion der vorderen Ebene. gimp_palette_set_background($color); $toplayer->edit_fill(BG_IMAGE_FILL); $toplayer->set_mode(COLOR_MODE); # Färbe die mittlere Ebene (vorerst) schwarz: gimp_palette_set_background([0,0,0]); $drawable->edit_fill(BG_IMAGE_FILL); # Danach wird die Ebene mit grauem Rauschen gefüllt: $amt = $amt / 255; $midlayer->plug_in_noisify (1, $amt, $amt, $amt, $amt); # Nun der einzige komplizierte Teil des Plugins: Die Ebene # erhält eine Ebenenmaske. Diese bestimmt, wieviel von der # darunterliegenden Ebene durchscheint, ist also eine Art Alpha-Kanal. $midmask = $midlayer->create_mask(0); # Die neu erzeugte Maske wird der Ebene hinzugefügt. Logischer # wäre der Aufruf mit $midlayer->add_layer_mask ($midmask). $img->add_layer_mask($midlayer, $midmask); # Um die horizontalen Streifen zu erzeugen, wird plug_in_grid # bemüht, mit dem man Gitter aller Art (auch horizontale Streifen) # erzeugen kann. Das Plugin malt in die Maske, bestimmt also # die Durchsichtigkeit: $midmask->plug_in_grid(1, $img->height * 3, 0, [0,0,0], 255, 1, 3, 0, [0,0,0], 255, 0, 0, 0, [0,0,0], 255); # Damit das Ganze nicht völlig künstlich und zu kontrastreich # wird, verwischt das Plugin die Maske noch etwas mit dem # Weichzeichner: $midmask->plug_in_gauss_iir(1.01, 1, 1); # Schließlich wird die Hintergrundfarbe wieder restauriert. gimp_palette_set_background($oldbackground); # Noch die Undo-Gruppe schließen. $img->undo_push_group_end; # Und fertig (displays_flush sorgt für ein Neuzeichnen der # Fenster, falls notwendig). gimp_displays_flush(); # Da das Plugin lediglich zwei Ebenen über ein Bild legt, wird # der Effekt erreicht, ohne das Bild selbst zu verändern! (); }; exit main;