Bild zuschneiden

Kalito

Erfahrenes Mitglied
ich werde noch wahnsinnig. Ich habe folgende Funktion:
PHP:
        //Bild-Quelle laden
        $file_name= 'bilder/urbild/'.$_SESSION['username'].'.jpg';
        list($w, $h, $type, $attr) = getimagesize($file_name);
        $pic_im = imagecreatefromjpeg($file_name);
        $pic_x = $_POST['x1'];   // Anfang x
        $pic_y = $_POST['y1'];   // Anfang y
        $pic_w = '100'; // weite
        $pic_h = '150'; // höhe
        $dest_x = '0';   // Ziel x
        $dest_y = '0';   // Ziel y

        $dest_im = imagecreatetruecolor($pic_w, $pic_h);
        $white = imagecolorallocate($dest_im, 255, 255, 255);
        imagefill($dest_im, 0, 0, $white);
        imagecopy($dest_im, $pic_im, $dest_x, $dest_y, $pic_x, $pic_y, $pic_w, $pic_h);
        header("Content-type: image/jpeg");
        imagejpeg($dest_im);

ich möchte gerne eien Bild zuschneiden, aber das Bild wird einfach nicht geschnitten. Genausowenig wird das neue Bild gespeichert. was mach ich hier also falsch bzw. habe ich vergessen?
 
Also zum Speichern: Ist klar warum da nix gespeichert wird, es wird ja an den Browser gesendet. Wenn du es speichern willst, musst du bei imagejpeg() einen Dateinamen angeben und den Header-Aufruf weglassen:

PHP:
        //header("Content-type: image/jpeg");
        imagejpeg($dest_im, "irgendein_cooler_bildname.jpg");

Zum zuschneiden:

Erstens: Wie genau äußert sich das Problem konkret? Was erwartest du, was dabei raus kommt? Was kommt tatsächlich raus?
Zweitens: Dürfte eigentlich keinen Unterschied machen, aber ich hab schon Pferde vor der Apotheke kotzen sehen. Laut Doku von php.net sollte bei imagecopy() für die Koordinaten int-Values angegeben werden. Du übergibst aber Strings. Vielleicht solltest du durch Casting bzw. korrekt Initialisierung da wirklich mal Zahlen drauß machen:

PHP:
        $pic_x = (int)$_POST['x1'];   // Anfang x
        $pic_y = (int)$_POST['y1'];   // Anfang y
        $pic_w = 100; // weite
        $pic_h = 150; // höhe
        $dest_x = 0;   // Ziel x
        $dest_y = 0;   // Ziel y

Das wird dein Problem sehr wahrscheinlich nicht beheben aber es ist so einfach sauberer.

Drittens: Hast du schon versucht, mal die Fehlerbehandlung einzuschalten (error_reporting/display_errors)? Kommen da irgendwelche Fehlermeldungen/Warnungen/Notices?
 
Zuletzt bearbeitet:
Also,

ich habe in einem Ordner ein Bild, welches eine bestimmte Größe hat und ich möchte dieses Bild auf eine standardisierte Größe zuschneiden. Der User kann vorher mittels eines Auswahlrahmen den Bereich des Fotos, was dann gespeichert werden soll auswählen. Daher kommen die 2 Post-Werte, die die Koordinaten der linken oberen Ecke angeben.

error_reporting(E_ALL) hat nichts ausgegeben.

Hab auch alle anderen Angaben umgesetzt und trotzdem wird nach wie vor das Bild nicht gespeichert :(
 
Hast du auch ini_set('display_errors', 1); verwendet?

Hast du mal testweise ausgegeben, ob in $_POST['x1'] und $_POST['y1'] überhaupt die Werte drin stehen, die du erwartest?
 
Ich hab es verwendet und die post_werte übermittel auch Werte. Hab sie jetzt auch erstmal auskommentiert und durch 0 ersetzt.
 
Ich habe den Code mal bei mir getestet, ein paar Fehlerbehandlungen eingebaut und er funktioniert prima. Es kommt ein Bild heraus, das 100x150 Pixel groß ist:

PHP:
//Bild-Quelle laden
$file_name= 'bilder/urbild/'.$_SESSION['username'].'.jpg';
$infos = getimagesize($file_name);
if(!$infos)
	die('Konnte die Bild-Informationen nicht holen.');

list($w, $h, $type, $attr) = $infos;

$pic_im = imagecreatefromjpeg($file_name);

if(!$pic_im)
  die('Konnte das Bild nicht als Ressource laden.');

// Testweise mal $pic_x und $pic_y initialisieren
$pic_x = 50;
$pic_y = 50;
//$pic_x = $_POST['x1'];   // Anfang x
//$pic_y = $_POST['y1'];   // Anfang y

$pic_w = 100; // weite
$pic_h = 150; // höhe
$dest_x = 0;   // Ziel x
$dest_y = 0;   // Ziel y

$dest_im = imagecreatetruecolor($pic_w, $pic_h);
if(!$dest_im)
  die('Konnte keine neue leere Bildressource mit den Abmaßen $pic_w und $pic_h erzeugen');

$white = imagecolorallocate($dest_im, 255, 255, 255);

imagefill($dest_im, 0, 0, $white);
imagecopy($dest_im, $pic_im, $dest_x, $dest_y, $pic_x, $pic_y, $pic_w, $pic_h);
header("Content-type: image/jpeg");
imagejpeg($dest_im);
 
Zurück