GD: Problem mit Transparenz
reiner_hohn
- php
Mit folgendem Code wird in den ersten 4 Zeilen ein rotes Quadrat (200*200px) erzeugt, welches mittig einen gruenen punkt (100*100px) beherbergt. Das grün wird als transparent definiert.
Danach wird ein blaues Quadrat (400*400px) erzeugt und das das rote mit dem transparenten Punkt daraufkopiert. Dabei geht aber die Transparenz verloren. Wenn ich mir nur das $src_img ausgeben lasse, dann ist der Punkt transparent und ich sehe die Hintergrundfarbe der Webseite auf welcher das Bild eingebunden ist.
Nach dem Kopiervorgang ist aber der punkt wieder grün. Mein Ziel ist es aber, dass dort die Hintergrundfarbe das großen blauen Quadrates durchscheint (sprich der Punkt also blau ist).
Hat jemand eine Idee, was hier das Problem ist bzw. wie ich es lösen kann?
Danke Reiner
<?
$src_img = imagecreatetruecolor(200,200);
imagefill($src_img,0,0,imagecolorallocate($src_img,255,0,0));
imagefilledarc($src_img,100,100,100,100,0,360,imagecolorallocate($src_img,0,255,0),0);
imagecolortransparent($src_img,imagecolorallocate($src_img,0,255,0));
$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);
header("Content-Type: image/png");
imagepng($dst_img);
?>
Hallo,
Nach dem Kopiervorgang ist aber der punkt wieder grün. Mein Ziel ist es aber, dass dort die Hintergrundfarbe das großen blauen Quadrates durchscheint (sprich der Punkt also blau ist).
tja, dann färbe diesen Punkt nicht grün (=transparent), sondern blau.
Hat jemand eine Idee, was hier das Problem ist bzw. wie ich es lösen kann?
Ein PNG-Datei ist ein Pixelbild mit genau einer Farbe je Bildpunkt und weist nicht mehrere Ebenen auf, so dass die Farbe der Hintergrundebene durch die transparente Farbe der Vordergrundebene durchscheinen könnte.
Freundliche Grüße
Vinzenz
Das ist in diesem Fall nur ein Test. Ich kann den Punkt nicht einfach blau färben, da der Hintergrund des blauen Quadrates später ein Hintergrundbild besitzt und dieses durch das "Loch" durchscheinen soll. Es muss auch nicht unbedingt ein PNG ausgegeben werden, mir ich auch jedes andere Format recht. Kann man das Problem denn grundsätzlich irgendwie lösen?
Hallo,
DIch kann den Punkt nicht einfach blau färben, da der Hintergrund des blauen Quadrates später ein Hintergrundbild besitzt und dieses durch das "Loch" durchscheinen soll. Es muss auch nicht unbedingt ein PNG ausgegeben werden, mir ich auch jedes andere Format recht. Kann man das Problem denn grundsätzlich irgendwie lösen?
Wenn es sich um ein einzelnes Bild handelt: Merke Dir den Inhalt des Loches und kopiere diesen wieder ganz oben. Was SVG in dieser Hinsicht kann, weiß ich nicht.
Freundliche Grüße
Vinzenz
Ich begreife es aber nicht :) ... Wenn ich mit einem Bildbearbeitungsprogramm ein rotes Quadrat erstelle welches einen transparenten Kreis in der Mitte hat, ich es als PNG abspeichere und dann mit dem Script auf das große blaue Quadrat kopiere, klappt es doch auch. Dann muss es doch auch irgendwie mit der GD möglich sein, dass das "Loch" durchsichtig ist.
Reiner
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
vielen dank, das hab mich sehr viel weiter gebracht.