2013-03-06 5 views
14

Je veux faire ce qui suit en PHP avec GD. ImageMagick est pas une option, malheureusement, mais cela semble être un problème commun qu'il y a être une solution, je ne peux pas sembler le trouver.PHP/GD - fond transparent

Je veux créer un fichier PNG avec un fond transparent. Ensuite, je veux dessiner un rectangle, copier une image dessus et ajouter du texte. Une façon de faire est la suivante:

$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); 

Cela fonctionne bien, sauf qu'une partie de l'image copiée peut être noir, et/ou le texte peut être noir. Cela devient alors transparent, ce que je ne veux pas .

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

Le code ci-dessus est quelque chose que j'ai trouvé en ligne, qui le remplit de rouge, puis rend rouge transparent. Encore une fois, tout le rouge dans l'image devient transparent. Je pourrais choisir une couleur qui est peu susceptible de se produire, mais je ne peux pas le garantir.

Y a-t-il quelque chose qui me manque? Cela peut-il être réparé? Merci pour vos réponses!

Répondre

26

imagecolortransparent est probablement pas ce que vous voulez ici si vous fusionnez les images, la transparence seule couleur est méchant.

Au lieu de cela, essayez avec un masque de remplissage transparent comme ceci:

<?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

par défaut imagealphablending true sur de vraies images de couleur si cela ne fait rien différent :) En outre, imagecreatetruecolor crée une image en noir, ce qui explique pourquoi la le premier morceau de code utilise imagecolortransparent (0); – Spinal

+0

Dans ce cas, je ne vois pas votre problème. J'ai testé ce qui précède en dessinant un rectangle noir au centre, et ça fonctionne très bien avec la transparence autour. –

+0

Vraiment? Alors quelque chose est probablement faux avec ma configuration, parce que si j'essaye le code suivant, j'obtiens un rectangle bleu avec du noir l'entourant! image $ = imagecreatetruecolor (800600); imagealphablending ($ image, true); imagefilledrectangle ($ image, 50,50, 750, 550, imagecolorallocate ($ image, 0,0128)); header ('Type de contenu: image/PNG'); imagepng ($ image); – Spinal