Sven Rautenberg: GD: Problem mit Transparenz

Beitrag lesen

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