Willkommen in der Webstatt Zum Webstatt Blog und Stories
Spark am 02.05.07 15:37

Hi!

Ich hab hier eine Funktion, die Bilder verkleinert.

Aufgabe des Scripts:
So lange das Bild beim verkleinern proportional bleibt, wird es ganz normal auf die blibige Größe geschrupft. Wenn aber die proportion nicht eingehalten wird, wird ein Teil aus dem Bild geschnitten, der die gewünscht Größe hat.

Das ganz Script ist nicht wirklich elegant geschrieben und hat auch noch so seine Macken.

Größtes problem: In manchen (bzw. vielen) Fällen haben die Bilder einen 1px großen Balken rechts und/oder unten!

function shrinkImage($image, $_newWidth = 0, $_newHeight = 0, $quality = 75) {
$size = getimagesize($image);
$width = $size[0];
$height = $size[1];
$newWidth = ($_newWidth == 0) ? intval($width*$_newHeight/$height) : $_newWidth;
$newHeight = ($_newHeight == 0) ? intval($height*$_newWidth/$width) : $_newHeight;
$startTop = 0;
$startLeft = 0;

if($_newWidth != 0 && $_newHeight != 0) {
$tmp_w = intval(($newWidth/$width)*100);
$tmp_h = intval(($newHeight/$height)*100);
/* Wenn das Bild nicht mehr proportional sein wird */
if($tmp_w != $tmp_h) { //Abweichungen von 1-2 Pixel zulassen?!
/* Bildgröße minus 5-40% und daraus einen Ausschnitt in gewünschter Größe */
$multiplier1 = $height/$newHeight;
$width_cut1 = round($newWidth*$multiplier1);
$height_cut1 = $height;
$multiplier2 = $width/$newWidth;
$width_cut2 = $width;
$height_cut2 = round($newHeight*$multiplier2);
if($width_cut1 <= $width && $height_cut1 <= $height) {
$width_cut = $width_cut1;
$height_cut = $height_cut1;
} else {
$width_cut = $width_cut2;
$height_cut = $height_cut2;
}
$percent = rand(5, 40);
$width_cut -= round(($width_cut/100)*$percent);
$height_cut -= round(($height_cut/100)*$percent);
$maxTop = $width-$width_cut;
$maxLeft = $height-$height_cut;
$startTop = rand(0, $maxTop);
$startLeft = rand(0, $maxLeft);
$width = $width_cut;
$height = $height_cut;
}
}

if($size[2] == 1) { //.gif
$oldPicture = ImageCreateFromGIF($image);
$newPicture = ImageCreate($newWidth, $newHeight);
ImageCopyResized($newPicture, $oldPicture, 0, 0, $startTop, $startLeft, $newWidth, $newHeight, $width, $height);
ImageGIF($newPicture, $image);
} else if($size[2] == 2) { //.jpg
$oldPicture = ImageCreateFromJPEG($image);
$newPicture = ImageCreateTrueColor($newWidth, $newHeight);
ImageCopyResized($newPicture, $oldPicture, 0, 0, $startTop, $startLeft, $newWidth, $newHeight, $width, $height);
ImageJPEG($newPicture, $image, $quality);
} else if($size[2] == 3) { //.png
$oldPicture = ImageCreateFromPNG($image);
$newPicture = ImageCreateTrueColor($newWidth, $newHeight);
ImageCopyResized($newPicture, $oldPicture, 0, 0, $startTop, $startLeft, $newWidth, $newHeight, $width, $height);
ImagePNG($newPicture, $image);
}
}

Ich benutze zum Testen Bilder verschiedenster größen und schrumpfe sie einmal auf 530px Breite ([COLOR=blue]shrinkImage('bild.jpg', 530)[/COLOR]) und auf 170x145 ([COLOR=blue]shrinkImage('bild.jpg', 170, 145)[/COLOR]).

Vielleicht hat ja der Eine oder Andere noch ein paar Vorschläge....??

netcup.de Warum gibt es hier Werbung?
Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt