PHP | Bildbearbeitung - Bilder übereinander legen, passt nicht
Karl
- php
Hallo,
ich versuche mich an der PHP Bildbearbeitung. Ich möchte gerne auf ein Backgroundbild ein "kleineres Bild" mittig positionieren. Background 1980px * 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?
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?
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.
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:
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.
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.
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.