Thumbnails erstellen mit PHP

0 | 29780 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Thumbnails erstellen mit PHP" mit Ihrem Wissen!

Anzeige Hier werben

Allgemeine Vorgehensweise

  • Bild laden
  • Leeren Thumbnail erstellen
  • Bild verkleinert in den Thumbnail kopieren
  • Thumbnail speichern/ausgeben

GD-Lib

Um Bilder in PHP bearbeiten zu können gibt es die GD-Lib. Mit Hilfe dieser Bibliothek können Bilder einfach erstellt und verändert werden.
Es sind schon alle nötigen Funktionen vorhanden um Bilder zu verkleinern, die einzige Aufgabe besteht also darin die GD-Lib richtig anzuwenden.
siehe: GD Lib in der PHP Anleitung

Vorüberlegungen

Bildformat

Grundsätzlich ist es egal, welches Bildformat ausgegeben wird. Man könnte jegliches Bildformat in ein Standardformat konvertieren. Ein Kandidat wäre hierzu das PNG-Format, das alle nötigen Eigenschaften mitbringt (Truecolor mit Alphakanal). Leider kommt es zu Problemen mit transparenten GIFs, die Transparenz kann durch PNG zwar dargestellt werden, allerdings funktionieren diese PNGs dann nicht im IE. Hier wird trotzdem einfach ein PNG ausgegeben, es sollte kein allzugroßes Problem darstellen die Sonderbehandlung für GIFs einzubauen.
Unabhängig davon, ist es notwendig für jedes Dateiformat eine eigene Funktion zum Laden der Bilder aufzurufen.

Thumbnailgröße

Es ist meist sinnvoller ist nur eine Maximalgröße anzugeben um das Seitenverhältnis des Bilder beizubehalten.

Vorgehensweise

Bild laden

Hier muss nun das Dateiformat einsgelesen werden, um die richtige Funktion zum Laden des Bildes aufzurufen. In der GD-Lib ist eine Funktion vorhanden, die die Größe eines Bildes ausliest. Glücklicherweise wird hier auch der Bildtyp zurückgeliefert.

Laden des Bildes  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$imagefile = 'foo.bar';
$imagesize = getimagesize($imagefile);
$imagewidth = $imagesize[0];
$imageheight = $imagesize[1];
$imagetype = $imagesize[2];
switch ($imagetype)
{
    // Bedeutung von $imagetype:
    // 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM
    case 1: // GIF
        $image = imagecreatefromgif($imagefile);
        break;
    case 2: // JPEG
        $image = imagecreatefromjpeg($imagefile);
        break;
    case 3: // PNG
        $image = imagecreatefrompng($imagefile);
        break;
    default:
        die('Unsupported imageformat');
}

Leeren Thumbnail erstellen

Wir müssen ein leeres Bild in der Größe des Thumbnails erstellen, um das verkleinerte Bild später in den Thumbail kopieren zu können. Hierzu kann einfach die Funktion imagecreatetruecolor() (oder für GIFs imagecreate()) verwendet werden. Da wir das Seitenverhältnis des Orginalbildes beibehalten wollen können wir nur Maximalausmaße für den Thumbnail festlegen. Die wirklichen Ausmaße werden dann aus diesen berechnet.

Hierzu wird zuerst davon ausgegangen, dass das Bild bereits kleiner ist als der gewünschte Thumbail. Dann wird zuerst die Breite und später die Höhe kontrolliert und das Bild jeweils um den Faktor, um den das Bild zu groß ist, runterskaliert. Somit wird die Maximalgröße für das Bild eingehalten.

Thumbnailgröße berechnen  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Maximalausmaße
$maxthumbwidth = 150;
$maxthumbheight = 100;
// Ausmaße kopieren, wir gehen zuerst davon aus, dass das Bild schon Thumbnailgröße hat
$thumbwidth = $imagewidth;
$thumbheight = $imageheight;
// Breite skalieren falls nötig
if ($thumbwidth > $maxthumbwidth)
{
    $factor = $maxthumbwidth / $thumbwidth;
    $thumbwidth *= $factor;
    $thumbheight *= $factor;
}
// Höhe skalieren, falls nötig
if ($thumbheight > $maxthumbheight)
{
    $factor = $maxthumbheight / $thumbheight;
    $thumbwidth *= $factor;
    $thumbheight *= $factor;
}
// Thumbnail erstellen
$thumb = imagecreatetruecolor($thumbwidth, $thumbheight);

Bild verkleinert in den Thumbnail kopieren

Hierzu wird imagecopyresampled() verwendet. imagecopyresized() wäre das naheliegendere, hat aber laut Dokumentation eine schlechtere Qualität.

Bild skalieren  
PHP
1
2
3
4
5
6
7
imagecopyresampled(
    $thumb,
    $image,
    0, 0, 0, 0, // Startposition des Ausschnittes
    $thumbwidth, $thumbheight,
    $imagewidth, $imageheight
);

Thumbnail speichern/ausgeben

Um den Thumbnail auszugeben wird nun nurnoch imagepng() benötigt. Anschließend sollte man imagedestroy() verwenden, um den belegten Speicher wieder freizugeben. Bei einer großen Anzahl Bilder könnte sonst der Arbeitsspeicher volllaufen.

Thumbnail speichern  
PHP
1
2
3
4
5
6
header('Content-Type: image/png');
imagepng($thumb);
// In Datei speichern
// $thumbfile = 'thumbs/' . $imagefile;
// imagepng($thumb, $thumbfile);
imagedestroy($thumb);

Was weiter?

In dem hier vorgestellten Code fehlen einige Features, die noch praktisch wären. Diese wurden aufgrund der Komplexität weggelassen, ich möchte sie zur Anregung weiterzumachen aber hier kurz auflisten.

  • GIFs richtig unterstützen (siehe oben)
  • Script direkt in das Bildverzeichnis kopieren und Transparent per htaccess (mod_rewrite) zum Erzeugen von Bildern verwenden
  • Parameter über Datenbank/$_GET erhalten (Maximalgröße, Bildname etc.)
  • Caching von bereits generierten Thumbnails
  • Alle unterstützten Bildtypen einbinden
  • Andere Methoden zur Thumbnailgenerierung/Größenberechnung (Überstand abschneiden o.ä.)

Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 2 Personen an der Seite "Thumbnails erstellen mit PHP" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Thumbnails erstellen mit PHP" hier bearbeiten.

Mitarbeiter