Karl: PHP | Bildbearbeitung - Bilder übereinander legen, passt nicht

Hallo,

ich versuche mich an der PHP Bildbearbeitung. Ich möchte gerne auf ein Backgroundbild ein "kleineres Bild" mittig positionieren. Background 1980px * 1080px:

Front 1080px * 1080px:

Mein Script:

//Jetzt fügen wir das ursprüngliche Bild ein
$im_background = imagecreatefromjpeg("background.jpg");
$im_background_x = imagesx($im_background); //Auslesen X
$im_background_y = imagesy($im_background); //Auslesen Y

$im_front = imagecreatefromjpeg("front.jpg");
$im_front_x = imagesx($im_front); //Auslesen X
$im_front_y = imagesy($im_front); //Auslesen Y

echo '<br>Front : '.$im_front_x.' '.$im_front_y.' ';
echo '<br>Back : '.$im_background_x.' '.$im_background_y.' ';

//Rechnen wir die Seitenwerte aus
$im_front_background_div = ($im_background_x - $im_front_x);
$im_front_background_div = $im_front_background_div / 2;
$im_front_background_div_2 = ($im_front_background_div + $im_front_background_div);

// Bilder erzeugen
$img = imagecreatetruecolor($im_background_x, $im_background_y);
// Hintergrundbild einfügen
imagecopy($img, $im_background, 0, 0, 0, 0, $im_background_x, $im_background_y);
// Vordergrund einfügen
imageCopyResampled($img, $im_front, $im_front_background_div, 0, 0, 0, $im_front_x, $im_front_y, $im_background_x, $im_background_y);
imagejpeg($img,"img001_finish.jpg",100);

Im Ergebnis sieht man allerdings das Bild in der Mitte hat einen schwarzen Balken und ist gestaucht? Ergebnis:

Sicher seht Ihr den Fehler direkt, was habe ich denn falsch gedacht?

akzeptierte Antworten

  1. Ich habe mit "$im_front_x" gespielt. Das Bild unabhängig von der Größe immer nur halb angezeigt. Wo ist denn da der Fehler?

  2. Tach!

    Sicher seht Ihr den Fehler direkt, was habe ich denn falsch gedacht?

    Bist du sicher, dass du beim Aufruf von imageCopyResampled() die richtigen Werte an die Positionen geschrieben hast? Schon die letzten beiden src_w und src_h sehen falsch aus. Laut PHP-Handbuch muss da die Größe des einzufügenden Bildes genommen werden und nicht die des Zieles.

    dedlfix.

    1. Stimmt, du hast vollkommen recht. imageCopyResampled($img, $im_front, $im_front_background_div, 0, 0, 0, $im_background_x, $im_background_y, $im_front_x, $im_front_y ); ist korrekt. Leider macht es das Ergebnis nicht besser: eigntlich müsste rechts ein "grauer" Rand sein. Die imagesx und imagesy funktionieren, denn Sie werfen folgendes aus:

      • Front : 1080 1080
      • Back : 1920 1080
      • Background_div : 420px
      1. Tach!

        imageCopyResampled($img, $im_front, $im_front_background_div, 0, 0, 0, $im_background_x, $im_background_y, $im_front_x, $im_front_y ); ist korrekt. Leider macht es das Ergebnis nicht besser:

        Das war auch noch nicht alles. Die zwei erwähnten waren nur ein Beispiel, dass bei diesem Funktionsaufruf der Hund begraben liegt. Schau mal im Handbuch nach, was die anderen Parameter noch bedeuten. dst_w und dst_h ist auch nicht die Breite des Zielbildes, sondern des Ausschnittes in den die Quelle eingefügt wird. Also wenn das einzufügende Bild nicht in der Größe zu ändern ist, müssen das auch da dessen Größenwerte sein.

        dedlfix.

        1. Hallo Delfix,

          vielen Dank für deine tolle Unterstützung. Für alle die über die Suche hier landen das ist der korrekte Fall: imageCopyResampled($img, $im_front, $im_front_background_div, 0, 0, 0, $im_front_x, $im_background_y, $im_front_x, $im_front_y );

          1. Tach!

            Für alle die über die Suche hier landen das ist der korrekte Fall: imageCopyResampled($img, $im_front, $im_front_background_div, 0, 0, 0, $im_front_x, $im_background_y, $im_front_x, $im_front_y );

            Im Prinzip muss für deinen Fall auch noch $im_background_y gegen $im_front_y getauscht werden, aber die haben bei gleichhohen Bildern ja denselben Wert.

            dedlfix.

  3. Ich würde dir empfehlen, mit der ImageMagick API zu arbeiten. Diese hat eine schöne, objektorientierte API und ist nach etwas Einarbeitung wesentlich angenehmer. Bei den meisten Hostern sollte PHP Imagick heutzutage verfügbar sein.