使用透明/Alpha背景的PHP GD文本

7

好的,我遇到一个问题,我的文本无法覆盖一张部分透明的图片。我希望文本是不透明的,但是图片的背景部分需要透明,而文本所在的部分需要完全不透明。目前的问题是文本继承了之前图层中的透明背景色。以下是代码、输出示例以及我希望得到的效果。图片放在浅灰色背景上,因此图片周围较深部分的浅色边框需要透明,但其他部分都不能透明,尤其是文本。看起来问题不在文本本身,而是文本块的背景色透明。这并不理想。请帮助我解决这个问题,这是我完成项目的唯一问题。:)

由于还不能发布图片,所以这里是示例输出和期望结果的图片链接(原图):

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

?>
1个回答

18

哈哈,我猜我没有认真思考。解决方法是在将文本覆盖到图像上之前重新打开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);

?>

其实我有类似的问题,在添加文本之前打开Alpha混合功能就像魔法一样解决了!谢谢! - ikhsan
是的,我在使用imagecopyresampled()调整大小之前必须将其关闭,并在使用imagettftext()放置文本之前重新打开以保持背景透明并避免字符周围出现灰色菱形。 - vladkras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接