Wenn man ein Upload für Bilder hat, will man meistens die Grösse des Bildes beschränken welches hochgeladen werden soll. Die einfachste Möglichkeit dazu wäre, einfach eine Fehlermeldung auszugeben falls ein zu grosses Bild hochgeladen wurde. Doch wer ärgert sich nicht auch immer darüber wenn man ein Formular zweimal abschicken muss nur weil jetzt es nicht 100% ausgefüllt hat? Ist es nun nicht nur ein Feld, welches nicht ausgefüllt wurde, sondern gleich ein zu grosses Bild ärgert man sich nur noch mehr. Dies muss nicht sein, denn wir können das bild auch direkt auf dem Server verkleinern.
Ich habe eine kleine Funktion geschrieben welche genau dies macht:
function resizeImage($img_src, $maxheight, $maxwidth, $quality=90)
{
// fals eine Grösse 0 ist wird sie auf 99999 gesetzt damit sie nicht beachted wird
if($maxheight == 0) $maxheight = 99999;
if($maxwidth == 0) $maxwidth = 99999;
// Grösse auslesen
$size = getimagesize($img_src);
$width_orig = $size[0];
$height_orig = $size[1];
// Diese Boolean Variable entscheidet ob was am Bild geändert werden muss
$redraw = false;
if($height_orig > $maxheight && $maxheight != 0)
{
// ist das Bild zu hoch wird die Breite proportional zur Maximalhöhe verkleinert
$newheight = $maxheight;
$newwidth = ceil($width_orig * $newheight / $height_orig);
$redraw = true;
}
else
{
$newwidth = $width_orig;
$newheight = $height_orig;
}
if($newwidth > $maxwidth && $maxwidth != 0)
{
// Ist das Bild zu breit wird die Breite proportional zur Breite verkleinert
$newwidth = $maxwidth;
$newheight = ceil($newheight * $newwidth / $width_orig);
$redraw = true;
}
// falls nun das Bild verkleinert werden muss wird es nun neu gezeichnet.
if($redraw)
{
// der Dateityp wird ermittelt
$file_arr = explode(".", $img);
$file_type = strtolower($file_arr[count($file_arr)-1]);
// Das Bild muss je nach Dateityp anders eingelesen werden
if($file_type == "png")
{
imagealphablending($img_src, true);
$src_img = ImageCreateFromPNG($img_src);
}
elseif($file_type == "gif")
{
imagealphablending($img_src, true);
$src_img = ImageCreateFromGIF($img_src);
}
else
$src_img = ImageCreateFromJPEG($img_src);
// Ein weisses Bild mit der oben berechneten Grösse wird erstellt
$handle = ImageCreateTrueColor($newwidth, $newheight);
$white = ImageColorAllocate($handle, 255, 255, 255);
imagefill($handle, 1, 1, $white);
// Unser Bild wird nun verkleinert und auf das eben erstellte weisse Bild gelegt.
imageCopyResampled ($handle, $src_img, 0, 0, 0, 0, $newwidth, $newheight, $width_orig, $height_orig);
// Das alte Bild wird mit dem neuem überschrieben
if ($file_type == 'png')
imagepng($handle, $img_src, $quality);
else if ($file_type == 'gif')
imagegif($handle, $img_src);
else
imagejpeg($handle, $img_src, $quality);
return 'Bild wurde verkleinert';
}
else return 'Bld musste nicht verkleinert werden';
}