|
Thumbnails mit PHP erzeugen
von Wolfgang
Arnberger
Manchmal möchte man Bilder verkleinern, um sie in einer
Übersicht anzuzeigen. Der einfachste Weg ist, die Bilder
durch HEIGHT= ... und WIDTH= ... im <IMG>-Tag zu verkleinern.
Dabei wird zwar das Bild optisch verkleinert, aber die Dateigröße
und somit die Übertragungszeit bleiben gegenüber
der vollen Größe unverändert.
Besser ist es, Thumbnails von den Bildern zu erzeugen. PHP
bietet alles, was man dafür braucht.
Bevor man sich mit der Verkleinerung von Bildern beschäftigt,
sollte man abklären, ob der Provider die notwendigen
Extensions anbietet. Listen Sie mit "phpinfo()"
die Einstellungen auf und kontrollieren Sie ob GD enthalten
ist. Andernfalls würde das nachfolgende Script auf Ihrem
Server nicht laufen.
Zum Testen und Entwickeln müssen Sie natürlich
auch Ihren lokalen Webserver entsprechend konfigurieren. Dazu
müssen die benötigten Extensions geladen werden.
In der PHP.INI wird dafür der Eintrag "extension=php_gd.dll"
aktiviert, indem das vorangestellte ";" entfernt
wird.
Die Datei "php_gd.dll" enthält ab der Version
1.6 nur mehr die Funktionen für .JPG und .PNG Dateien.
Für .GIF Dateien wird die "php_gd_gif.dll"
benötigt. Achten Sie auch darauf, daß der Pfad
zu den Extensions in der PHP.INI richtig eingestellt ist (z.B.
extension_dir ="C:\php4\extensions").
Hier nun das Script:
<? $PicPathIn="../bilder/"; $PicPathOut="../bilder/out/";
// Orginalbild $bild="Foto.jpg";
// Bilddaten feststellen $size=getimagesize("$PicPathIn"."$bild"); $breite=$size[0]; $hoehe=$size[1]; $neueBreite=100; $neueHoehe=intval($hoehe*$neueBreite/$breite);
if($size[2]==1) { // GIF $altesBild=ImageCreateFromGIF("$PicPathIn"."$bild"); $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe); ImageCopyResized($neuesBild,$altesBild,0,0,0,0, $neueBreite,$neueHoehe,$breite,$hoehe); ImageGIF($neuesBild,"$PicPathOut"."TN"."$bild"); }
if($size[2]==2) { // JPG $altesBild=ImageCreateFromJPEG("$PicPathIn"."$bild"); $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe); ImageCopyResized($neuesBild,$altesBild,0,0,0,0, $neueBreite,$neueHoehe,$breite,$hoehe); ImageJPEG($neuesBild,"$PicPathOut"."TN"."$bild"); }
if($size[2]==3) { // PNG $altesBild=ImageCreateFromPNG("$PicPathIn"."$bild"); $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe); ImageCopyResized($neuesBild,$altesBild,0,0,0,0, $neueBreite,$neueHoehe,$breite,$hoehe); ImagePNG($neuesBild,"$PicPathOut"."TN"."$bild"); }
echo "Altes Bild:<BR>"; echo "<IMG SRC=\"$PicPathIn$bild\" WIDTH=\"$breite\" HEIGHT=\"$hoehe\"> <BR><BR>"; echo "Neues Bild:<BR>"; $Thumbnail=$PicPathOut."TN".$bild; echo "<IMG SRC=\"$Thumbnail\" WIDTH=\"$neueBreite\" HEIGHT=\"$neueHoehe\">";
Mit "$size=getimagesize("$PicPathIn"."$bild")"
werden die Eigenschaften des Bildes ermittelt. Die Funktion
liefert ein Array zurück, das die Breite, die Höhe
und den Bildtyp enthält.
Da für jeden Bildtyp eigene Funktionen anzuwenden sind,
muß mit "if($size[2]==...)" entsprechend unterschieden
werden.
Das Herzstück ist die Funktion "ImageCopyResized()".
Damit wird das neue Bild erzeugt. Allerdings benötigt
die Funktion nicht die Dateinamen des Orginalbildes bzw. der
Zieldatei, sondern den Identifier dieser Dateien.
Diese Identifier werden von den Funktionen "ImageCreateFrom...()"
für das Orginalbild und "ImageCreate()" für
die Zieldatei erzeugt.
Der Rest ist ganz einfach. Der Funktion "ImageCopyResized()"
werden die Identifier, die Startpositionen (0,0) und die Bildformate
übergeben. Das Resultat wird mit "Image...()"
in die entsprechende Datei geschrieben. Im obigen Script habe
ich den verkleinerten Dateien die Buchstaben "TN"
als Kennzeichnung für Thumbnails vorangestellt. Andernfalls
würde man die Orginaldatei überschreiben, wenn man
die Thumbnails im selben Directory ablegt.
Wenn Sie die erzeugte Bilddatei ansehen, ist sie natürlich
optisch kleiner und benötigt entsprechend weniger Speicherplatz
und somit auch weniger Übertragungszeit.
|
Download |