[gd] 2 Bilder mit Transparenz aufeinander kopieren

Thomas D

Erfahrenes Mitglied
Hallo!

Ich versuche mit gd2 zwei Bilder auf folgende Art und Weise zu mergen:

Rahmen
Ausgangsbild
Gewünschtes Resultat

Dabei ist es also wichtig, dass das zweite Bild innerhalb des Rahmens kopiert werden soll - ich benötigte also Transparenz. Mein Code sieht wie folgt aus:

Code:
<?php
$thumb = createSpecicalThumbnail ("testImg.jpg", 100, 44); //Funktion, die die Graphik an die Dimensions (100, 44) anpasst
$rahmen = imagecreatefromgif("rahmen.gif");

imagealphablending($rahmen, false);
$blackTransp = imagecolorallocate($rahmen, 0, 0, 0); //schwarz als Transparenz auswählen
imagecolortransparent($rahmen, $blackTransp);

$blank = imagecreate(100, 44);

imagecopy($blank, $thumb, 0, 0, 0, 0, 100, 40);
imagecopy ($blank, $rahmen, 0, 0, 0, 0, 80, 30); //bewusst nicht voll, damit man den Kopiervorgang nachvollziehen kann (später kommen anstatt (80, 30) natürlich (100, 40) hin

if (imagegif($blank, "testi.gif"))
    echo "ok";
else
    echo "not ok";

Das Resultat sieht hierbei wie folgt aus: http://www.thomasd.info/temp/gdproblem/testi.gif

Wie man sehen kann, wird das Schwarz trotzdem kopiert. Auch mit einem transparenten PNG als Rahmenbild habe ich es schon versucht - mit demselben Resultat. Wie muss ich die Transparenz einstellen, damit der Rahmen so über das Ausgangsbild kopiert wird, dass es passt? Bin für jeden Hinweis dankbar :) ...

MfG, Thomas D.

BTW: gd-Version: 2.0.34
 
Nach wirklich ewigem Hin und Her, habe ich nun endlich eine Lösung gefunden ;-) Ich habe ein transparentes PNG (in Photoshop erstellt) genommen und folgende Code-Kombination angewandt:

Code:
$thumb = createSpecicalThumbnail ("testImg.jpg", 100, 44);
$rahmen = imagecreatefrompng("rahmen.png");

$transpCol = imagecolorat ($rahmen, 40, 20); //hier befindet sich mit Sicherheit eine Transparenzinformation - innerhalb des Rahmens
imagecolortransparent($rahmen, $transpCol);

//$blackTransp = imagecolorallocate($rahmen, 0, 0, 0);
imagesavealpha ($rahmen, true);

$blank = imagecreatetruecolor(100, 44);

imagecopy($blank, $thumb, 0, 0, 0, 0, 100, 44);
imagecopy ($blank, $rahmen, 0, 0, 0, 0, 100, 44);

imagepng($blank, "testi.png");

Ich bin jetzt extrem froh, dass es nun endlich nach stundenlangem Probieren und einigen Frustrationsmomenten endlich hingehauen hat ;-)!
 
Zurück