Подчеркивать текст, используя imagettftext

Мой вопрос: как мне подчеркнуть весь текст на изображении?

Код:

function createImage($text) { $text .= "\n"; $text = wordwrap($text, 40, "\n"); $newlines = substr_count($text, "\n"); if($newlines == 0) { $height = 30; } else { $height = 30*$newlines-$newlines*7; } putenv('GDFONTPATH=' . realpath('.')); header('Content-Type: image/png'); $im = imagecreatetruecolor(315, $height); $white = imagecolorallocate($im, 255, 255, 255); $grey = imagecolorallocate($im, 128, 128, 128); $black = imagecolorallocate($im, 0, 0, 0); $purple = imagecolorallocate($im, 97, 26, 139); imagefilledrectangle($im, 0, 0, 399, $height, $white); $font = 'arialbd.ttf'; imagettftext($im, 11, 0, 10, 20, $purple, $font, $text); imagepng($im); imagedestroy($im); } createImage("Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow Stackoverflow "); 

РЕЗУЛЬТАТЫ http://img.ruphp.com/php/Jdr7HPy.png

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

Related of "Подчеркивать текст, используя imagettftext"

Используйте символ Unicode, сочетающий символ U + 0332.

Для изменения текста вам понадобится цикл или умное слияние массивов,

 $e = explode(' ', $text); for($i=0;$i<count($e);$i++) { $e[$i] = implode('&#x0332;', str_split($e[$i])); } $text = implode(' ', $e); 

Вы можете сделать это, выяснив размеры текста в пикселях с помощью imagettfbbox() , а затем используйте его в качестве ссылки для рисования линий под текстом. Я играл с ним, и вот моя попытка:

 function createImage($text){ putenv('GDFONTPATH=' . realpath('.')); $text = wordwrap($text, 40, "\n"); $padding = 10; // padding around text $uOffs = 2; // distance between the line and the text above it $uHeight = 1; // height of the under-line $lines = explode("\n", $text); // split text in lines $lineLengths = array(); // will store length of each line $textSize = 11; $font = 'arialbd.ttf'; // bounding box of all text $textBoundingBox = array_map('abs', imagettfbbox($textSize, 0, $font, $text)); list($blx, $bly, $brx, $bry, $trx, $try, $tlx, $tly) = $textBoundingBox; // calculate image dimensions based on the bounding box data $x = max($brx, $trx) + ($padding * 4); $y = max($blx, $bly) + ($padding * 4); $img = imagecreatetruecolor($x, $y); // determine length of each line of text foreach($lines as $i => $line){ $box = imagettfbbox($textSize, 0, $font, $line); $lineLengths[$i] = max($box[2], $box[4]); } $white = imagecolorallocate($img, 255, 255, 255); $grey = imagecolorallocate($img, 128, 128, 128); $black = imagecolorallocate($img, 0, 0, 0); $purple = imagecolorallocate($img, 97, 26, 139); imagefilledrectangle($img, 0, 0, $x - 1, $y - 1, $white); imagettftext($img, $textSize, 0, $padding + min($tlx, $blx), $padding + min($tly, $bly), $purple, $font, $text); // starting Y position of the under-line $uY = $padding + min($tly, $bly); // underline text... foreach($lineLengths as $length){ imagefilledrectangle($img, $padding + min($tlx, $blx), $uY + $uOffs, $padding + $length, $uY + $uOffs + $uHeight, $purple); $uY += 19; } header('Content-Type: image/png'); imagepng($img); imagedestroy($img); } 

Результат:

введите описание изображения здесь

Это немного более гибко, используя символы Unicode, потому что вы контролируете высоту строки и позицию относительно текста над ней.