Moin!
Hat jemand eine Idee, was hier das Problem ist bzw. wie ich es lösen kann?
Du spielst zu sehr mit imagecolorallocate() rum. Bei der Nutzung von True-Color-Bildern ist diese Funktion eigentlich überflüssig, da man die Farbe nicht als Farbindex der Farbtabelle (wie bei GIF) angeben muss, sondern direkt einen 24-Bit-Wert z.B. als Hexzahl schreiben kann:
<?
$src_img = imagecreatetruecolor(200,200);
//imagefill($src_img,0,0,imagecolorallocate($src_img,255,0,0));
imagefill($src_img,0,0,0xFF0000); // Macht genau dasselbe, nur lesbarer.
// Zahlen, die mit "0x" beginnen, versteht der PHP-Parser als Hexadezimalzahl
// Die Rückgabe von imagecolorallocate() ist übrigens genau der kombinierte 24-Bit-Wert aus Rot-, Grün- und Blauwert.
imagefilledarc($src_img,100,100,100,100,0,360,imagecolorallocate($src_img,0,255,0),0);
// Hier genau dasselbe: imagecolorallocate() ist im Prinzip überflüssig. Aber:
imagecolortransparent($src_img,imagecolorallocate($src_img,0,255,0));
// Das nachträgliche Transparentmachen ist auch böse, weil's nur für GIFs funktioniert, nicht für TrueColor-Farben. Im GIF-Modus mit nur 256 Farben gibt es nur exakt eine Farbe, die 100% transparent ist. Im TrueColor-Modus kann jede Farbe zusätzlich noch einen Transparentlevel von 0-127 bekommen.
// imagecolorallocatealpha() hat dafür einen eigenen Parameter, als Resultat kommt aber auch dort nur ein Bytewert heraus, der allerdings 32 Bit lang ist (bzw. 31 Bit). Die Transparenz kommt als weiterer Hex-Wert ganz an den Anfang der Hexzahl:
imagefilledarc($src_img,100,100,100,100,0,36,0x7f00ff00);
// Schon malt die Farbe 100% transparentes Grün.
$dst_img = imagecreatetruecolor(400,400);
imagefill($dst_img,0,0,imagecolorallocate($dst_img,0,0,255));imagecopy($dst_img,$src_img,100,100,0,0,200,200);
// imagecopy() ist hier allerdings auch falsch, weil es keine Transparenz mitkopiert. imagecopymerge() wäre korrekt, dort gibt es einen weiteren Parameter für die Transparenz der Kopie (auch ein 0% transparentes Bild könnte man damit durchscheinend machen), aber siehe auch die Anmerkung: "When pct = 0, no action is taken, when 100 this function behaves identically to imagecopy() for pallete images, while it implements alpha transparency for true colour images."
header("Content-Type: image/png");
imagepng($dst_img);?>
- Sven Rautenberg