2010-01-25 80 views
7

好吧,我的文本覆蓋在部分透明的圖像上有問題。我希望文字是堅實的,但我希望圖像的背景的一部分是透明的,文字結束的部分要堅實,我有,問題是文字是繼承透明背景之一的之前的圖層。這裏是代碼,以及輸出的例子,並且在那個輸出下我想要它的樣子。圖像鋪設在淺灰色的背景上,因此在較暗的灰色之間圖像周圍的光線邊緣是透明的,但沒有其他特別應該是文字。它似乎不是自己的文本,而是透明的文本塊的背景。正如你所看到的,這不是很理想。請幫助,這是我留下來完成我的項目的唯一問題。 :)帶有透明度/ Alpha背景的PHP GD文本

不能發表圖片呢,所以繼承人的鏈接,例如輸出的圖像和期望的結果(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); 

?> 

回答

19

哈,我想我沒想到它夠硬。解決方案是在將文本放到圖像上之前重新打開imagealphablending。

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

其實我有類似的問題,在添加文本之前變成alphablending就像魅力一樣!謝謝! – ikhsan 2013-11-06 11:46:46

+0

是的,我不得不在關閉imagecopyresampled()調整大小之前關閉它,然後在將文本與imagettftext()放在一起以保持背景透明並避免字符周圍出現灰色菱形 – vladkras 2014-01-23 14:11:31