Spaß mit Perl und Bildern

Mit Perl kann man auch Bilder bauen, seien es normale Bilder/Logos, Captchas oder Screenshots.

 

Bilder/Logos:

„Nur“ GD nötig.

Beispiel:
$ vi logo.pl

use strict;
use GD;

# Bildobjekt; (width,height)
my $bild = new GD::Image(600,300);

# Erzeuge Farben
# Die erste Farbe die definiert wird wird auromatisch die Hintergrundfarbe.
my $weiss = $bild->colorAllocate(255,255,255);
my $schwarz = $bild->colorAllocate(0,0,0);
my $blau = $bild->colorAllocate(0,0,255);
my $rot = $bild->colorAllocate(255,0,0);
my $gelb=$bild->colorAllocate(233,244,123);

# Transparenter Hintergrund
$bild->transparent($weiss);

# Interlaced
$bild->interlaced('true');

# Schwarzen Rahmen um das Bild
$bild->rectangle(0,0,99,99,$black);

# Male ein blauen Kreis an der Stelle 50x50
$bild->arc(50,50,95,75,0,360,$blue);

# Und fülle den Kreis Rot aus
$bild->fill(50,50,$red);

# Schreibe Text vertikal an den linken Rand
$bild->stringUp(gdLargeFont,2,150,"Text am linken Rand",$gelb);

# Mache einen Strich in Rot auf halber hoehe ueber das ganze Bild
$bild->line(0,150,600,150,$rot);

# Mache einen schraegen Strich, durch das oval bis zur Mittellinie in rot
$bild->line(0,0,150,150,$rot);

# Schreibe Text horizontal auf der roten Linie in blau
my $text1='Text auf der roten Linie';
$bild->string(gdLargeFont,150,130,$text1,$blau);

# Schreibe Text horizontal unter der roten Linie in blau
my $text2='Text auf der roten Linie';
$bild->string(gdLargeFont,150,152,$text2,$blau);

# Das ganze in Datei als PNG ausgeben
open(F, "> bild.png");
print F $bild->png;
close(F);

$ perldoc GD
Versorgt/Erschlägt einen mit Informationen über die komplette Funktionsvielfalt.

 

Captchas selbst gebaut:

HP: http://search.cpan.org/~burak/GD-SecurityImage-1.66/lib/GD/SecurityImage.pm
Dependencie: GD

Installieren via CPAN oder:
/usr/local/src # wget http://search.cpan.org/CPAN/authors/id/B/BU/BURAK/GD-SecurityImage-1.66.tar.gz
/usr/local/src # tar xzf GD-SecurityImage-1.66.tar.gz
/usr/local/src # cd GD-SecurityImage-1.66
/usr/local/src/GD-SecurityImage-1.66 # perl Makefile.PL && make && make test && make install

Beispiel:
$ vi captcha.pl

use strict;
use GD::SecurityImage;

# Zeichenkette/Wort (mind. 6 Zeichen!) welche im Bild dargestellt wird.
# Möglichst random und nicht wie hier einfacher statischer Text.
my $rnd_str='Text12';
# Datei in die das Bild gespeichert wird. Hier nur als Beispiel als Datei und nicht nach STDOUT. 
my $sessionid='sess_1234'.'.png';
# Konfiguriere GD-Image Objekt.
my $bild = GD::SecurityImage->new(width    => 150,
                                   height   => 50,
                                   lines    => 10,
                                   scramble => 1,
                                   gd_font  => 'giant'
                                   );

# Übergebe (Random)String an Bild
$bild->random($rnd_str);

# Erzeuge Bild
$bild->create(normal => 'ec');

# Print partikel über das ganze Bild, ggf. sollte man dafür
# dann beim create statt 'ec', 'blank' nehmen.
$bild->particle;

# Gebe Bild, MIME-Typ und Zeichenkette aus
my($img_data, $mime_type, $img_string) = $bild->out;

# Achtung, hier sind alle Möglichen Verschleierungen aktiv!
# Man sollte das ein oder andere weglassen. "scramble => 1"
# ist jedoch sehr empfohlen. :-)
# $img_data => Das Bild selbst.
# $mime_type => Typ des Bildes, Default: "png".
# $img_string = Das selbe wie $rnd_str nochmal ausgegeben um es z.B. in ein Cookie zu schieben.

# Das ganze in Datei ausgeben
open(F, "> $sessionid");
print F $img_data;
close(F);

 

Screenshots:

HP: http://search.cpan.org/~tonyc/Imager-Screenshot-0.007/Screenshot.pm
Dependencie: Imager

Installieren via CPAN oder:
/usr/local/src # wget http://search.cpan.org/CPAN/authors/id/T/TO/TONYC/Imager-Screenshot-0.007.tar.gz
/usr/local/src # tar xzf Imager-Screenshot-0.007.tar.gz
/usr/local/src # cd Imager-Screenshot-0.007/
/usr/local/src/Imager-Screenshot-0.007 # perl Makefile.PL && make && make test && make install

Beispiel:
$ vi screenshot.pl

use strict;
use Imager::Screenshot qw(screenshot);

my $file='screenshot.png';

# Erzeuge screenshot vom aktuellen Fenster/Workspace
my $scr=screenshot;

# Schreibe screenshot in Datei
$scr->write(file => $file);