dsNDesign
Erfahrenes Mitglied
Hei,
ich möchte ein Bild auf eine bestimmte Größe verkleinern (180x140px).
Dazu verkleiner ich es zunächst auf eine Größe, in welcher die Proportionen behalten werden. Also kommt nach dem ersten Schritt z.B. ein Bild der Größe 195x140px raus.
Bei diesem Bild möchte ich nun noch den Rand abschneiden, dass es am Ende 180x140px groß ist. Jedoch will das nicht so ganz funktionieren.
Mein Code:
Hier noch das Ergebnis des Skripts:
Und das Original:
Wie man sieht, wird das Bild zwar auf die 180x140px verkleinert, jedoch verzerrt. Außerdem ist ein schwarzer Balken am Rand.
Woran liegt das?
Gruß
ich möchte ein Bild auf eine bestimmte Größe verkleinern (180x140px).
Dazu verkleiner ich es zunächst auf eine Größe, in welcher die Proportionen behalten werden. Also kommt nach dem ersten Schritt z.B. ein Bild der Größe 195x140px raus.
Bei diesem Bild möchte ich nun noch den Rand abschneiden, dass es am Ende 180x140px groß ist. Jedoch will das nicht so ganz funktionieren.
Mein Code:
PHP:
list($img_width, $img_height) = @getimagesize($file_path);
if (!$img_width || !$img_height) {
return false;
}
$scale = max(
$options['max_width'] / $img_width,
$options['max_height'] / $img_height
);
if ($scale >= 1) {
if ($file_path !== $new_file_path) {
return copy($file_path, $new_file_path);
}
return true;
}
$new_width = $img_width * $scale;
$new_height = $img_height * $scale;
$dstX = 0.5 * ($options['max_width'] - $new_width);
$dstY = 0.5 * ($options['max_height'] - $new_height);
$new_img = @imagecreatetruecolor($new_width, $new_height);
switch (strtolower(substr(strrchr($file_name, '.'), 1))) {
case 'jpg':
case 'jpeg':
$src_img = @imagecreatefromjpeg($file_path);
$write_image = 'imagejpeg';
$image_quality = isset($options['jpeg_quality']) ?
$options['jpeg_quality'] : 75;
break;
case 'gif':
@imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
$src_img = @imagecreatefromgif($file_path);
$write_image = 'imagegif';
$image_quality = null;
break;
case 'png':
@imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
@imagealphablending($new_img, false);
@imagesavealpha($new_img, true);
$src_img = @imagecreatefrompng($file_path);
$write_image = 'imagepng';
$image_quality = isset($options['png_quality']) ?
$options['png_quality'] : 9;
break;
default:
$src_img = null;
}
@imagecopyresampled(
$new_img,
$src_img,
0, 0, 0, 0,
$new_width,
$new_height,
$img_width,
$img_height
);
$final_img = @imagecreatetruecolor($options['max_width'], $options['max_height']);
$success = $new_img && @imagecopyresampled(
$final_img,
$new_img,
0, 0,
$dstX,
$dstY,
$options['max_width'],
$options['max_height'],
$new_width,
$new_height
) && $write_image($final_img, $new_file_path, $image_quality);
@imagedestroy($src_img);
@imagedestroy($new_img);
@imagedestroy($final_img);
return $success;
Hier noch das Ergebnis des Skripts:
Und das Original:
Wie man sieht, wird das Bild zwar auf die 180x140px verkleinert, jedoch verzerrt. Außerdem ist ein schwarzer Balken am Rand.
Woran liegt das?
Gruß