gimp/plug-ins/perl/examples/randomart1

90 lines
2.8 KiB
Perl
Executable File

#!/usr/bin/perl
use Gimp;
use Gimp::Fu;
# Definiere die Konstante "pi mal zwei"
use constant PIx2 => 8 * atan2 1,1;
register "random_art_1", # Funktionsname
"Create a Random Tile", # Kurzhilfe
"Create a tileable image by repeatedly drawing colourful polygons",
# Hilfetext
"Marc Lehmann", # Autor
"Marc Lehmann <pcg\@goof.com", # Copyright
"0.3", # Version/Datum
"<Toolbox>/Xtns/Render/Random Art #1", # Menüpfad
"", # Bildtypen
# Eingabeparameter
# Typ Name Beschreibung Wert
[
[PF_INT32, 'width', 'Image Width', 300],
[PF_INT32, 'height', 'Image Height', 300],
[PF_SLIDER, 'num_poly', 'Number of Polygons', 20, [5,100,1]],
[PF_SLIDER, 'edges', 'Number of Edges', 10, [3, 30, 1]],
[PF_SLIDER, 'revolutions', 'Number of Revolutions',1, [1, 3, 1]],
[PF_SLIDER, 'feather', 'Feather Radius', 30, [1, 100]],
[PF_BOOL, 'supersample', 'Adaptive Supersampling?', 0],
],
[PF_IMAGE],
sub { # Perl-Code
# Die Parameter werden ganz "normal" übergeben:
my ($w,$h,$num_poly,$edges,$revolutions,$feather,$super)=@_;
# Erzeuge ein neues Bild
my $image = new Image($w,$h,RGB);
$image->disable_undo;
# Erzeuge die erste Ebene für das Bild
my $layer = $image->layer_new($w,$h,RGB_IMAGE,
"Random Art #1",100,NORMAL_MODE);
# Füge sie in das Bild ein
$image->add_layer($layer,0);
# Setze die Hintergrundfarben
Palette->set_background('white');
# ...und lösche die Ebene damit
$layer->fill(BG_IMAGE_FILL);
# Jetzt wurde ein neues, leeres Bild erzeugt, und
# das Zeichnen kann beginnen.
# Erzeuge zufällige Polygone, fülle sie mit einem
# zufälligen Farbgradienten und verschiebe das Bild
# wiederholt.
for (1..$num_poly) {
my @ecken;
for (1..$edges*$revolutions) {
my $r = rand(0.4)+0.1;
push(@ecken, $w/2+sin($_*PIx2/$edges)*$r*$w,
$h/2+cos($_*PIx2/$edges)*$r*$h);
}
# Selektiere die Region
$image->free_select (\@ecken, REPLACE, 1, 1, $feather);
# Wähle zufällig zwei Farben aus
Palette->set_foreground([rand(256),rand(256),rand(256)]);
Palette->set_background([rand(256),rand(256),rand(256)]);
# Un erzeuge einen Farbverlauf über das Bild
$layer->blend (FG_BG_HSV, DIFFERENCE_MODE, LINEAR, 100,
0, REPEAT_TRIANGULAR, $super, 2, 3,
$w/2, $h/2,
rand($w), rand($h));
# Und dann verschiebe das Bild etwas
$layer->channel_ops_offset (1,0,(rand(0.8)+0.1)*$w,(rand(0.8)+0.1)*$h);
}
$image->enable_undo;
# Gib das neu erzeugte Bild zurück, damit es angezeigt wird.
$image;
};
exit main;