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';
}
mal davon abgesehen, dass das kein oop ist, finde ich zwei wichtigere dinge suboptimal:
1) returntype ist ein string? ich würde entweder einen status zurückgeben, der global definiert ist (klassenkonstante z.b.), oder wenigstens true/false. output hat in einer funktion, die normalerweise einem model zugeordnet ist, nichts zu suchen
2) weißer hintergrund? wie verhält sich das mit transparenz?
außerdem, will man wirklich die quelldatei löschen? ich verstehe da nicht ganz den sinn hinter. wenn es um eine dateigrößenbeschränkung gibt, dann würde ich die hart per php oder headern durchsetzen, und nicht ein viel zu großes bild annehmen und dann selbst runtersamplen.
Was fürn Return du nemen willst ist jedem selbst überlassen. Da ist es jetzt einfach ein String zum verdeutlichen was welcher Fall bedeuted. In diesem Fall gieng es nicht um eine Dateigrössenbeschränkung sondern nur darum, dass das Bild das Layout nicht verzieht.