Bilder verkleinern, Thumbnails erzeugen mit PHP

Ein Artikel über Hoch- und Querformat, Orientation und Skalierung von digitalen Bildern

Wenn Sie ein Foto vor sich haben was breiter ist als hoch, ist das dann Querformat? Weit gefehlt diese Annahme! Denn ob ein Foto in Hochformat oder in Querformat ist, entscheidet mitnichten das Verhältnis von Höhe und Breite. So ist das Foto was vor Ihnen auf dem Tisch liegt und breiter als hoch ist dadurch eben nicht automatisch in Querformat sondern kann auch ein hochformatiges Bild sein was einfach nur um 90° gedreht wurde.

Diese simple Erkenntnis ist wichtig, wenn wir Bilder verkleinern wollen. Programmiertechnisch spielen die Seitenverhältnisse nämlich überhaupt keine Rolle, die alleinige Vorgabe der neuen Breite oder der Höhe reicht da volkommen. Und ob das Bild in Hochformat oder Querformat ist, das ergibt sich aus der Orientation welche die Kamera (hoffentlich) in den Exif-Daten der Bilddatei hinterlegt hat. Und überhaupt gibt es schon bei der Aufnahme vier Möglichkeiten wie die Kamera auf das Motiv gehalten wird. Siehe Schema untenstehend, linke Bildhälfte (gespiegelt rechte Bildhälfte):

Orient

Bild verkleinern mit PHP

Mit diesen Vorbetrachtungen entwickeln wir nun den PHP-Code. Wir geben einfach die neue Breite vor und berechnen damit die neue Höhe:

$newwidth = 480; list($width, $height) = getimagesize($path); # berechne die neue Höhe $rat = $width/$newwidth; $newheight = $height/$rat;

Nun benötigen wir noch die Orientierung:

$exif = exif_read_data($path); $orient = isset($exif['Orientation']) ? $exif['Orientation'] : 1;

Dann geht es an die Erstellung der Resourcen womit das neue Bild kopiert werden kann:

# GD Ressource Thumb erstellen //Achtung: imagecreatetruecolor funktioniert nur bei bestimmten GD Versionen //Falls ein Fehler auftritt, imagecreate nutzen if(function_exists("imagecreatetruecolor")) { $thumb = imagecreatetruecolor($newwidth,$newheight); } else{ $thumb = imagecreate ($newwidth,$newheight); } # GD Ressource Original $source = imagecreatefromjpeg($path); # Ressource kopieren imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

Zum Schluß wird dann der Orientierung entsprechend das neue Bild gedreht und ausgegeben:

# Obenstehene 4 Fälle abdecken if($orient == 8){ $thumb = imagerotate($thumb,90,0); } else if($orient == 6){ $thumb = imagerotate($thumb,-90,0); } else if($orient == 3){ $thumb = imagerotate($thumb,180,0); } # Bei Orientierung 1 ist nichts zu tun # Image Header falls die Ausgabe an den Webserver geht header("Content-Type: image/jpeg"); imagejpeg($thumb); # cleanup ImageDestroy($thumb); ImageDestroy($source);

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.