- Automatisches Verlinken von Internetadressen
- chmod bei vielen Dateien via FTP
- Erstellung von Vorschaubildern
- Weiterleitung von HTTP-Requests an einen anderen Server
- weitere in Bearbeitung
Codebeispiele zu Perl
Erstellung von Vorschaubildern
Wenn man auf einer Webseite sehr viele Bilder hat, kann es sehr viel Aufwand sein, diese entsprechend zu präsentieren. Vielleicht will man eine Tabelle mit kleinen Vorschaubildern haben, auf die man klicken kann, und dann öffnet sich ein weiteres Fenster mit dem eigentlichen Bild in Originalgröße.
Man kann zwar in HTML mit dem HTML-Tag <img src="$bildUrl" width="100" /> das Bild auf eine bestimmte Größe skalieren, jedoch wird da immer noch das volle Bild übertragen, und wenn jedes Bild sehr groß ist und Dutzend auf einer Seite dargestellt werden, kann die Ladezeit sehr lang werden.
Besser dürfte in diesem Fall sein, wenn man kleine Vorschaubilder (=Thumbnails) erzeugt, die in der Übersicht angezeigt werden, sodass die großen Originalbilder erst dann heruntergeladen werden müssen, wenn sie sich jemand anschaut.
Hier ein Codebeispiel zum Erzeugen von Thumbnails mit Perl für .jpg und .png-Dateien:
01: #! /usr/bin/perl 02: use warnings; 03: use strict; 04: use File::DosGlob(); 05: use Image::Size(); 06: use GD; 07: # --- Configuration --- 08: my $path = "images"; # where are the original images located 09: my $thumbnailPath = "thumbs"; # where to write the thumbnails 10: my $thumbnailWidth = 100; # width of thumbnails 11: my $thumbnailQuality = 90; # integer from 1 to 100 12: # --- Code --- 13: GD::Image->trueColor(1); # improves image quality: thx to Perli from www.perl.de 14: # loop over all files in directory 15: for my $filename (&File::DosGlob::glob("$path/*.*")) { 16: # get thumbnail height and width and heigth of original image 17: my ($thumbnailHeight, $width, $height) = 18: &GetImageSize($filename, $thumbnailWidth) 19: or next; 20: 21: # extract filetype and convert it to lowercase 22: my ($ending) = $filename =~ /\.([^.]+?)$/; 23: $ending = lc($ending); 24: 25: # build target filename 26: my $targetFilename = $filename; 27: $targetFilename =~ s/\Q$path\E/$thumbnailPath/g; 28: 29: # do some debugging output 30: print "$filename: ${width}x$height\t"; 31: print "=> $targetFilename: ${thumbnailWidth}x$thumbnailHeight\n"; 32: my $image; # try to read image 33: if ($ending eq 'jpg' or $ending eq 'jpeg') { 34: $image = GD::Image->newFromJpeg($filename); 35: } 36: elsif ($ending eq 'png') { 37: $image = GD::Image->newFromPng($filename); 38: } 39: # check if reading was successful 40: $image or warn ("Error: couldn't read $filename as $ending: $!\n"), next; 41: # create thumbnail 42: my $thumbnail = GD::Image->new($thumbnailWidth, $thumbnailHeight); 43: $thumbnail->copyResized( $image, 0,0, 0,0, 44: $thumbnailWidth, $thumbnailHeight, 45: $width, $height, 46: ); 47: 48: # open outfile 49: open (OUT, ">$targetFilename") or 50: warn("Error: couldn't create '$targetFilename': $!\n"), next; 51: binmode (OUT); 52: # write image to file 53: if ($ending eq 'jpg' or $ending eq 'jpeg') { 54: print OUT $thumbnail->jpeg($thumbnailQuality); 55: } 56: elsif ($ending eq 'png') { 57: print OUT $thumbnail->png(); 58: } 59: # close file and do error checking (e.g. disk full?) 60: close (OUT) or warn "Error: couldn't write to file '$targetFilename': $!\n"; 61: 62: } # for 63: # ------------------------------------------------------------ 64: sub GetImageSize { 65: my ($filename, $thumbnailWidth) = @_; 66: my (@size) = &Image::Size::attr_imgsize($filename); 67: unless ( $size[1] and $size[3]) { 68: warn "Error: couldn't get imagesize of $filename\n"; 69: return (); 70: } # unless 71: my $thumbnailHeight = int $thumbnailWidth * $size[3] / $size[1]; 72: return ($thumbnailHeight, @size[1,3]); 73: } # GetImageSize 74: # ------------------------------------------------------------
Das Modul Image::Size ist leider kein Standardmodul, kann jedoch sehr einfach installiert werden (eine sehr gute Alternative dazu ist Image::Info). Das Modul GD ist leider auch kein Standardmodul und ist wegen der vielen Abhängigkeiten ziemlich komplex zu installieren. Bei den meisten Linux-Distributionen ist es dabei, sodaß man es so am einfachsten installieren kann. Für Activestate-Perl haben gottseidank ein paar Leute schon fertige Pakete geschnürt, die man mit ppm installieren kann. Leider ist es ein wenig schwierig, diese Pakete zu finden. Für Perl5.8 findet man es (sowie viele weitere) auf http://mirror.dulug.duke.edu/pub/apache/perl/win32-bin/ppms/. Mächtigere Alternativen zu GD sind Image::Magick und Gimpperl.