2013-03-06 17 views
14

Ich möchte Folgendes in PHP in Kombination mit GD tun. ImageMagick ist leider keine Option, aber das scheint so ein häufiges Problem zu sein, dass eine Lösung ist, ich kann es einfach nicht finden.PHP/GD - transparenter Hintergrund

Ich möchte ein PNG mit einem transparenten Hintergrund erstellen. Dann möchte ich ein Rechteck darauf zeichnen, ein Bild darauf kopieren und etwas Text hinzufügen. Eine Möglichkeit, dies zu tun, ist wie folgt:

$image = ImageCreateTrueColor (800, 600); 
imagecolortransparent ($image, 0); //0 is pure black, the default fill color 
imagerectangle (...); 
//code to copy an image 
imagettftext ($image, ...); 
imagepng ($image); 

Dies funktioniert gut, außer, dass ein Teil des kopierten Bildes kann schwarz sein, und/oder der Text kann schwarz sein. Das wird dann auch transparent, was ich nicht will.

imagefill ($image, 0,0, 0x7FFF0000); 
imagetransparent ($image, 0x7FFF0000); 

Der obige Code ist etwas, das ich online gefunden, die es mit roten füllt, dann rot transparent macht. Dies führt wiederum dazu, dass das gesamte Rot im Bild transparent wird. Ich könnte eine Farbe wählen, die unwahrscheinlich ist, aber ich kann das nicht garantieren.

Gibt es etwas, das mir fehlt? Kann das behoben werden? Danke für Ihre Antworten!

Antwort

26

imagecolortransparent ist wahrscheinlich nicht das, was Sie hier wollen, wenn Sie Bilder zusammenführen, da einfarbige Transparenz unangenehm ist.

Stattdessen versuchen Sie es mit einer transparenten Maske Füllung etwa so:

<?php 
$image = imagecreatetruecolor(100, 100); 

// Transparent Background 
imagealphablending($image, false); 
$transparency = imagecolorallocatealpha($image, 0, 0, 0, 127); 
imagefill($image, 0, 0, $transparency); 
imagesavealpha($image, true); 

// Drawing over 
$black = imagecolorallocate($image, 0, 0, 0); 
imagefilledrectangle($image, 25, 25, 75, 75, $black); 

header('Content-Type: image/png'); 
imagepng($image); 
+0

imagealphablending standardmäßig true auf farbechte Bilder so tut dies nichts anderes :) Auch schafft imagecreatetruecolor ein schwarzes Bild, weshalb die das erste Codeelement verwendet imagecolortransparent (0); – Spinal

+0

In diesem Fall sehe ich Ihr Problem nicht. Ich habe das obige getestet, indem ich ein schwarzes Rechteck in der Mitte gezeichnet habe, und es funktioniert gut mit Transparenz herum. –

+0

Wirklich? Dann stimmt wohl etwas mit meinem Setup nicht, denn wenn ich den folgenden Code ausprobiere, bekomme ich ein blaues Rechteck mit schwarzem umrandet! $ image = imagecreatetruecolor (800,600); imagealpblending ($ image, true); imagefilledrectangle ($ image, 50, 50, 750, 550, imagecolorallocate ($ image, 0,0,128)); header ('Inhaltstyp: image/PNG'); imagepng ($ image); – Spinal

Verwandte Themen