Dynamische Grafikerzeugung mit Perl (GD)
von Roland Bernert

Installation
Es muss das Perl-GD-Modul installiert sein.

Ein erstes Beispiel zeigt, wie man schnell eine Grafik erzeugen und ausgeben kann:
(Name: image1.pl)

#!/usr/bin/perl
use GD;

print "Content-type: image/gif\n\n";
$x = 100;   # Größe des Bildes
$y = 20;

$image = new GD::Image($x,$y);  # Bild erzeugen
$white = $image->colorAllocate(255,255,255);
$red = $image->colorAllocate(255,0,0);
$black = $image->colorAllocate(0,0,0);

$image->string(gdLargeFont,0,0,"test",$red);
$image->line(1,1,30,30,$black);
$image->line(30,1,1,50,$black);

print $image->gif;

exit(0);



Das zweite Beispiel zeigt, wie man innerhalb einer dynamisch erzeugten HTML-Seite eine dynamisch erzeugte Grafik ausgeben kann. Dabei ist image1.pl das Script, das die Grafik erzeugt (siehe oben).
#!/usr/bin/perl
# -------------------------------------
# zeigt wie man ein dynamisch erzeugtes
# Bild mittles CGI-Script in einer
# HTML-Seite einbaut
# 2006 by R. Bernert
# --------------------------------------
print "Content-type: Text/html\n\n";
print "
  <HTML><BODY>
  Die ist ein Test
 </BODY></HTML>\n
 ";

# jetzt wird das Script zur Erzeugunbg des Bildes aufgerufen
print "<img src=image1.pl>\n";
exit(0);


Das dritte Beispiel zeigt, wie man die erzeugten Grafiken abspeichert und in einer dynamisch erzeugten HTML-Seite ausgibt:
#!/usr/bin/perl
use GD;

print "Content-type: Text/html\n\n";
$x = 100;
$y = 20;

$image = new GD::Image($x,$y);
$white = $image->colorAllocate(255,255,255);
$red = $image->colorAllocate(255,0,0);
$black = $image->colorAllocate(0,0,0);

$image->string(gdLargeFont,0,0,"test",$red);
$image->line(1,1,30,30,$black);
$image->line(30,1,1,50,$black);

$testimg="testimage_neu.gif";
$gifimage= $image->gif;
open(FILE,"> $testimg");
print FILE "$gifimage";
close(FILE);

# Nun Ausgabe der HTML-Seite
# --------------------------
print "<HTML><BODY>

Dies ist ein Test<BR>
<img src=testimage_neu.gif>

</BODY></HTML>\n";
exit(0);



Das letzte Beispiel fasst mehrere Möglichkeiten zusammen:
#!/usr/bin/perl
# -------------------------------------------
# die Anwendung zeigt, wie man mit Hilfe der
# Perl-GD-Bibliothek zur laufzeit
# dynamisch Bilder erzeugen und ausgeben kann
# --------------------------------------------
use GD;

print "Content-type: text/html\n\n";

#erzeugen eines ersten Bildes
$image = new GD::Image(100,20);
$white = $image->colorAllocate(255,255,255); # Hintergrundfarbe
$red = $image->colorAllocate(255,0,0);
$black = $image->colorAllocate(0,0,0);

$image->string(gdLargeFont,0,0,"test",$red); # einen Text ins Bild
$image->line(1,1,30,30,$black);   # ein paar Linien
$image->line(30,1,1,50,$black);

# abspeichern des ersten Bildes
$ImageFileName="testimage_neu.gif";
$gifimage= $image->gif;  # das Bild selbst
open(FILE,"> $ImageFileName");
print FILE "$gifimage";
close(FILE);

# -----------------------------------------
# ein zweites Bild erzeugen uns speichern
# -----------------------------------------
$image2 = new GD::Image(175,175);
# Farben zur Verfuegung stellen
# die erste Farbe ist Hintergrundfarbe

$white = $image2->colorAllocate(255,255,255); 
$red = $image2->colorAllocate(255,0,0);
$black = $image2->colorAllocate(0,0,0);

$image2->string(gdLargeFont,73,83,"test",$red); # einen Text ins Bild
for ($i=0; $i<=70; $i=$i+10) {
  $image2->line(1+$i,1+$i,174-$i,1+$i,$black);
  $image2->line(174-$i,1+$i,174-$i,174-$i,$black);
  $image2->line(174-$i,174-$i,1+$i,174-$i,$black);
  $image2->line(1+$i,174-$i,1+$i,1+$i,$black);
}
# abspeichern des zweiten Bildes
$Image2FileName="testimage2_neu.gif";
open(FILE,"> $Image2FileName");     # das Bild selbst als GIF
print FILE $image2->gif;
close(FILE);

# ------------------------------------
# ein Polyon erzeugen und speichern
# ------------------------------------
$image3 = new GD::Image(175,175);
$white = $image3->colorAllocate(255,255,255); 
$red = $image3->colorAllocate(255,0,0);
$black = $image3->colorAllocate(0,0,0);

$polygon = new GD::Polygon;
$polygon->addPt(2,2);
$polygon->addPt(100,50);
$polygon->addPt(20,100);
$polygon->addPt(104,26);
$polygon->addPt(36,150);
$image3->filledPolygon($polygon,$red);

# abspeichern des Polygons
$PolygonFileName="polygon.gif";
open(FILE,"> $PolygonFileName");   # das Polygon als GIF
print FILE $image3->gif;
close(FILE);

# nun Ausgabe der HTML-Seite
# ------------------------------------
print <<Homepage;
  <html>
  <body>
    Dies ist ein Test
    <br>
    <img src = '$ImageFileName'>
    <BR>
    <IMG SRC = '$Image2FileName'>
    <BR>
    <IMG SRC = '$PolygonFileName'>
  </body>
  </HTML>
Homepage

exit(0);


Hier noch ein einfaches Beispiel zum Ausprobieren:
von Reza Mirbashiri (Mitarbeiter der Rechenzentrums).

#!/usr/local/bin/perl
#use CGI::Carp qw(fatalsToBrowser);
use GD::Graph::lines; #also "points","linespoints","bars","hbars","area"
my @data = (
["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
[ 6203, 3050, 3973, 2859, 3012, 3423, 1230]
);
my $graph = new GD::Graph::lines( 400, 300 );

$graph->set(
x_label => 'Wochentage',
y_label => 'Seitenaufrufe',
title => 'Balken Seite',
);
print "Content-type: image/png\n\n";

# print($graph->plot( \@data ));
print $graph->plot(\@data)->png;

# my $gd = $graph->plot( \@data );
exit;

print("\n");
for $key (sort keys %ENV){
print("$key: $ENV{$key}\n");
}

Roland Bernert