PHP GD Imagettf文本透明

PHP GD Imagettftext transparent

我正在尝试使用 imagettftext 编写透明文本,但我不能(使用 imagestring 可以,但无法 select 您自己的字体和大小)。最终图像应该是带有透明文本的灰色矩形,这样如果我将图像放在新背景上,该背景在文本中是可见的。

我的代码是:

$font = "./Verdana.ttf";
$fontSize = 12;
$img = imagecreatetruecolor(600, 600);
imagealphablending($img, false);
imagesavealpha($img, true);
$transparent = imagecolorallocatealpha($img, 255, 255, 255, 127);
$grey = imagecolorallocate($img, 127, 127, 127);
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey);
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $transparent, $font, "This is a transparent text");
imagepng($img);

这里的解决方案应该简单;切换到非混合模式(通过 imagealphablending($img, false);)并添加具有完全透明颜色的文本。但是 PHP 中似乎存在一个错误(在 7.0.7 中测试,在撰写本文时是最新的),这导致文本呈现为一系列矩形而不是字母。

一个非常快速和简单的解决方法是取消 $transparent 的颜色索引以禁用抗锯齿:

imagettftext($img, $fontSize, 0, $text_posX, $text_posY, -$transparent, $font, 'TEST');

但是,如果您希望文本消除锯齿,您可以:

  • 创建双倍所需尺寸的图片(宽×2,高×2)
  • 使用上面的否定方法添加别名文本
  • 通过imagecopyresampled()调整图像大小(宽度÷2,高度÷2)以伪造基本的抗锯齿效果。

所以,基本上,这个:

$font = "./Verdana.ttf";
$fontSize = 24; // note: double your original value.
$img = imagecreatetruecolor(1200, 1200); // note: double your original values.
imagealphablending($img, false);
imagesavealpha($img, true);
$transparent = imagecolorallocatealpha($img, 255, 255, 255, 127);
$grey = imagecolorallocate($img, 127, 127, 127);
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey);
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, -$transparent, $font, "This is a transparent text");

$dest = imagecreatetruecolor(600, 600);
imagealphablending($dest, false);
imagesavealpha($dest, true);
imagecopyresampled($dest, $img, 0, 0, 0, 0, 600, 600, 1200, 1200);

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