В этой статейке, я хочу показать как можно средствами GD наложить на картинку текст с подчеркиванием.
К сожалению, в GD нет стандартных средств для применения стилей к тексту — нельзя задать тексту ни подчеркивание, ни жирность, ни курсив.
Можно конечно, для таких случаев перерисовать шрифты :) Но такой вариант слишком трудоемкий и долгий. Я решил не трогать шрифты, а нарисовать подчеркивание сам.
Идей простая — пишем текст, нужным шрифтом, а после этого просто рисуем линии под каждой строчкой. Алгоритм прост: разбиваем весь текст на строки, измеряем длину каждой строки, получаем координаты строки и рисуем линию.
А вот готовый алгоритм:
$text = $_POST['text']; // любой текст $fontSise = 48; // размер текста $fontName = "arial.ttf"; // путь к шрифту $padLeft = 100; // отступ текста слева $padTop = 100; // отступ текста сверху $textColor = 0x008000; // цвет текста $pathForImg = '/tmp/'; //путь для сохранения картинки $im = imageCreateFromJpeg($img); // картинка // наносим текст imagettftext($im, $fontSise, 0, $padLeft, $padTop, $textColor, $fontName, $text); // делим текст на строки (по переходу на новую строку) $str = str_replace(array("\r\n", "\r", "\n"), '=SEPARATION=', strip_tags($text)); $arrayLines = explode("=SEPARATION=", $str); // Получение размеры строки $arrayWidthLines = array(); $arrayHeightLines = array(); foreach($arrayLines as $i => $oneLine){ $textbox = imagettfbbox($fontSise, 0, $fontName, $oneLine); $arrayWidthLines[$i] = $textbox[2] - $textbox[0]; $arrayHeightLines[$i] = $textbox[1] - $textbox[7]; } // рисование линий $paddingLine = 5; // отступ линии от начала текста foreach($arrayWidthLines as $i => $oneWidth){ imagesetthickness($im, 3); // толщина линии // рисуем линию imageline ($im, $padLeft , $padTop + ($fontSise*2)*$i+$paddingLine, $padLeft +$oneWidth, $padTop + ($fontSise*2)*$i+$paddingLine, $textColor); } // сохраняем картинку imagejpeg($im, $pathForImg); // В конце освобождаем память imageDestroy($im);