В этой статейке, я хочу показать как можно средствами 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);
