Текст PHP GD с прозрачностью / альфа-фоном - PullRequest
7 голосов
/ 25 января 2010

хорошо, поэтому у меня возникла проблема с наложением текста на частично прозрачное изображение. я хочу, чтобы текст был сплошным, но я хочу, чтобы часть фона изображения была прозрачной, а часть текста - сплошной, что у меня есть, проблема в том, что текст наследует прозрачный фон одного из предыдущие слои. Вот код и пример вывода, и под этим выводом, как я хочу, чтобы он выглядел. изображение лежит на светло-сером фоне, поэтому светлая граница вокруг изображения между более темным серым цветом прозрачна, но больше ничего не должно быть, особенно в тексте. кажется, что это не сам текст, а фон прозрачных текстовых блоков. что, как вы можете видеть, не очень желательно. Пожалуйста, помогите, это единственная проблема, которую я оставил, чтобы завершить свой проект. :)

пока не может публиковать изображения, поэтому здесь есть ссылка на изображение примера вывода и желаемого результата ( 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);

?>

1 Ответ

19 голосов
/ 25 января 2010

хах, я думаю, я не думал об этом достаточно усердно. решение состояло в том, чтобы снова включить очистку изображения перед наложением текста на изображение.

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

?>
...