Bildausschnitt speichern? (imagecopyresampled)

Dustin84

Erfahrenes Mitglied
Hallo,
ich habe hier ein Script gebastelt, um einheitliche Profilbilder zu haben, nämlich 150x150px.

Der Benutzer läd z.B. ein jpg mit 288x338px hoch und durch die Funktion imagecopyresampled zentriere ich eine 150x150px große Auswahl in der Mitte des hochgeladenen Bildes und speicher dies dann.

Soweit die Theorie...

In der Praxis erhalte ich sowas
testavatar_result.jpg

Original siehe hier:
Terminator_Hauptseite.jpg

Irgendwas scheint da mit den Koordinaten nicht zu stimmen... Hilfe bitte :)

PHP:
	// Get file from upload form
	$filename = $_FILES['profilbildupload']['tmp_name'];
	// Get file dimensions
	list($orig_width, $orig_height) = GetImageSize($filename); // Orig img dimensions 288x338px
	// New Thumbnail size
	$new_width = 150;
	$new_height = 150;
	// Center Crop
	$start_x = floor(($orig_width/2)-($new_width/2)); // Result: 69px from left
	$start_y = floor(($orig_height/2)-($new_height/2)); // Result: 94px from top
	// Resample
	$image_p = imagecreatetruecolor($new_width, $new_height);
	$image = imagecreatefromjpeg($filename);
	imagecopyresampled($image_p, $image, 0, 0, $start_x, $start_y, $new_width, $new_height, $orig_width, $orig_height);
	// Output
	$save_img_to_path = $_SERVER['DOCUMENT_ROOT'].'/_profilbilder/'.$_SESSION['webuser']['ID'].'.jpg';	
	imagejpeg($image_p, $save_img_to_path, 100);
 
Nimm dir das Bild mal in Photoshop oder Gimp vor. Schneide dann einen gewünschten Ausschnitt manuell aus und merk dir die Koordinaten. Dann kannst du diesen Ausschnitt mit deinem automatisch generierten vergleichen. Ein grober Test mit Gimp zeigt, das dein Skript offensichtlich sauber arbeitet und genau das tut was du willst.
 
ah was ich jetzt erst sehe: Der Terminator-Kopf auf meinen generiertem Bild ist kleiner als auf dem Original. Das ist falsch!
Ich möchte ja nur einen zentrierten Bildausschnitt haben.

So gehts:
PHP:
imagecopyresampled($image_p, $image, 0, 0, $start_y, $start_x, $orig_width, $orig_height, $orig_width, $orig_height);
 
Zurück