PHP Thumbnails erzeugen: Das Bildformat
Als nächstes checken wir, ob das Bild Hoch oder Querformat hat und schreiben das Ergebnis in die entsprechende Variable. Da wir erst jetzt alle Daten beieinander haben können wir erst jetzt überprüfen, ob überhaupt ein Thumbnail erzeugt werden muss. Ist das nicht der Fall, wird das Bild direkt ohne Umwege ausgegeben. Achtung bei den Headerfunktionen ! Diese funktionieren nur, wenn zuvor kein anderer Header gesendet wurde, bereits ein Leerzeichen, selbst per include reingeholt, macht die Funktion unmöglich. Ansonsten ist dies aber ein guter Weg für eine Umleitung.
// Muss ein Thumbnail erstellt werden ?
// -----------------------------------------------------------------------------
if ($format=="breit" & $bild[0]<$tnImage['width_max'])
Header("Location: $bildkomplett");
elseif ($format=="hoch" & $bild[1]<$tnImage['width_max'])
Header("Location: $bildkomplett");
Nun benötigen wir nur noch einen neuen Handle für das zu verkleinernde Bild, denn nur die Kopie und nicht das Original wird verändert.
$renfile = $_SERVER[DOCUMENT_ROOT].$cat_path.$gallery_path."/".$bild_db[pic_name];
Nun bauen wir uns das neu berechnete Thumbnail. Dieses MUSS berechnet werden, um zu gewährleisten, dass auch wirklich das Seitenverhältnis nicht zerstört wird.
// Thumbnail errechnen ...
// -----------------------------------------------------------------------------
if ($format=="hoch") {
$tnOther = round($bild[1]*$tnImage['height_opt']/$bild[0]);
$thumbnail = ImageCreateTrueColor($tnImage['height_opt'],$tnOther);
$dest_x = $tnImage['height_opt'] - $insertfile_width;
$dest_y = $tnOther - $insertfile_height;
if ($bild[2]==2)
{
ImageCopyResampled($thumbnail,ImageCreateFromJpeg($renfile),0,0,0,0,$tnImage['height_opt'],$tnOther,$bild[0],$bild[1]);
ImageCopy($thumbnail,$insertfile_id,$dest_x,$dest_y,0,0,$insertfile_width,$insertfile_height);
header("Content-type: image/jpeg");
ImageJPEG($thumbnail);
ImageDestroy($thumbnail);
}
else
{
ImageCopyResampled($thumbnail,ImageCreateFromPNG($renfile),0,0,0,0,$tnImage['height_opt'],$tnOther,$bild[0],$bild[1]);
ImageCopy($thumbnail,$insertfile_id,$dest_x,$dest_y,0,0,$insertfile_width,$insertfile_height);
header("Content-type: image/png");
ImagePNG($thumbnail,$tn_name);
ImageDestroy($thumbnail);
}
}
else
{
$tnOther = round($tnImage['width_opt']*$bild[1]/$bild[0]);
$thumbnail = ImageCreateTrueColor($tnImage['width_opt'],$tnOther);
$dest_x = $tnImage['width_opt'] - $insertfile_width;
$dest_y = $tnOther - $insertfile_height;
if ($bild[2]==2)
{
ImageCopyResampled($thumbnail,ImageCreateFromJPEG($renfile),0,0,0,0,$tnImage['width_opt'],$tnOther,$bild[0],$bild[1]);
ImageCopy($thumbnail,$insertfile_id,$dest_x,$dest_y,0,0,$insertfile_width,$insertfile_height);
header("Content-type: image/jpeg");
ImageJPEG($thumbnail);
ImageDestroy($thumbnail);
}
else
{
ImageCopyResampled($thumbnail,ImageCreateFromPNG($renfile),0,0,0,0,$tnImage['width_opt'],$tnOther,$bild[0],$bild[1]);
header("Content-type: image/png");
ImagePNG($thumbnail);
ImageDestroy($thumbnail);
}
}
Das sieht schlimmer aus als es ist
Sicher gibt es einen eleganteren Weg aber so auf die schnelle funktioniert diese verschachtelte if Anweisung eigentlich ganz gut. Je nachdem ob es sich um ein Hoch oder Querformat handelt werden die jeweiligen Variablen mit der Optimalen Thumbnailgröße anders eingesetzt um die optimalen Bilddimensionen unter Beibehaltung des Seitenverhältnisses zu errechnen. Um ganze Zahlen und keine Brüche zu erhalten, werden die Ergebnisse gerundet. Dann wird mittel ImageCreate ein neues Bildhandle mit den Abmessungen erschaffen und in die Variable $thumbnail geschrieben. Dann wird entschieden wie, abhängig vom Dateiformat, weiter mit dem Originalbildhandle zu verfahren ist.