2010-01-25 9 views
7

Très bien, donc je n'ai pas de problème avec mon texte posé sur une image partiellement transparente. je veux que le texte soit solide, mais je veux qu'une partie de l'arrière-plan de l'image soit transparente, et la partie que le texte est finie est solide, ce que j'ai, le problème est que le texte hérite de l'arrière-plan transparent d'un les couches précédentes. voici le code, et un exemple de la sortie, et sous cette sortie ce que je veux qu'il ressemble. l'image est sur un fond gris clair, donc la bordure lumineuse autour de l'image entre le gris plus foncé est transparente mais rien d'autre ne devrait être surtout le texte. il semble que ce ne soit pas le texte lui-même mais l'arrière-plan des blocs de texte qui est transparent. ce qui, comme vous pouvez le voir, n'est pas très souhaitable. S'il vous plaît, aidez, c'est le seul problème qui me reste pour terminer mon projet. :)Texte PHP GD avec fond transparent/Alpha

ne peuvent pas poster encore des images, de sorte Heres un lien vers l'image de sortie exemple et le résultat souhaité (orig):

enter image description here

<?php 

$img = imagecreatetruecolor(200, 50); 

$imageX = imagesx($img); 
$imageY = imagesy($img); 

imagealphablending($img, false); 
imagesavealpha($img, true); 

$transparent = imagecolorallocatealpha($img, 255,255,255, 127); 
$white = imagecolorallocate($img, 255,255,255); 
$grey = imagecolorallocate($img, 127,127,127); 
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey); 
imagefilledrectangle($img, 2, 2, $imageX-4, $imageY-4, $transparent); 

$font = "./arialbd.ttf"; 
$fontSize = 12; 
$text = "THIS IS A TEST"; 

$textDim = imagettfbbox($fontSize, 0, $font, $text); 
$textX = $textDim[2] - $textDim[0]; 
$textY = $textDim[7] - $textDim[1]; 

$text_posX = ($imageX/2) - ($textX/2); 
$text_posY = ($imageY/2) - ($textY/2); 

imagefilledrectangle($img, 10, 10, $imageX-10, $imageY-10, $grey); 
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $white, $font, $text); 

header("Content-Type: image/png"); 
imagepng($img); 

?> 

Répondre

19

hah Je suppose que je ne pensais pas assez fort dessus. la solution consistait à retourner l'imagealphablending avant de poser le texte sur l'image.

<?php 

$img = imagecreatetruecolor(200, 50); 

$imageX = imagesx($img); 
$imageY = imagesy($img); 

imagealphablending($img, false); 
imagesavealpha($img, true); 

$transparent = imagecolorallocatealpha($img, 255,255,255, 127); 
$white = imagecolorallocate($img, 255,255,255); 
$grey = imagecolorallocate($img, 127,127,127); 
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey); 
imagefilledrectangle($img, 2, 2, $imageX-4, $imageY-4, $transparent); 

$font = "./arialbd.ttf"; 
$fontSize = 12; 
$text = "THIS IS A TEST"; 

$textDim = imagettfbbox($fontSize, 0, $font, $text); 
$textX = $textDim[2] - $textDim[0]; 
$textY = $textDim[7] - $textDim[1]; 

$text_posX = ($imageX/2) - ($textX/2); 
$text_posY = ($imageY/2) - ($textY/2); 

imagefilledrectangle($img, 10, 10, $imageX-10, $imageY-10, $grey); 
imagealphablending($img, true); 
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $white, $font, $text); 

header("Content-Type: image/png"); 
imagepng($img); 

?> 
+0

En fait, j'ai un problème similaire, et en tournant alphablending sur avant d'ajouter le texte fonctionne comme un charme! Merci! – ikhsan

+0

Oui, je devais l'éteindre avant de redimensionner avec 'imagecopyresampled()' et revenir sur avant de mettre du texte avec 'imagettftext()' pour garder l'arrière-plan transparent et éviter les losanges gris autour des caractères – vladkras