Студия создания и продвижения сайтов Mittelspiel - Челябинск
 
Группа Создание сайтов в Челябинске ВКонтакте Мы в Twitter Миттельшпиль - Создание сайтов в Челябинске в Facebook Миттельшпиль - Создание сайтов в Челябинске в Мой Мир Миттельшпиль - Создание сайтов в Челябинске в Живом журнале Миттельшпиль - Создание сайтов в Челябинске в Однокласниках

Создание сайтов в Челябинске. Продвижение сайта

Закажите создание сайта у каомпании Миттельшпиль
 
Студия создания сайтов Mittelspiel  
 
  Студия веб-дизайна Mittelspiel. Создание сайтов. Продвижение сайта в Челябинске.  
   
Студия веб-дизайна Mittelspiel

PHP GD выравнивание многострочного текста

Мы уже рассматривали в статье «PHP GD перенос строки длинного текста» проблему автоматического переноса строк, но что если текст нам нужно разместить по середине заданной области, т.е. отцентровать. Не всегда ведь текст располагается прижатым к левой части. А может нам понадобится текст выровнять по правому краю, как тогда быть?

Html средствами сделать это просто, а как разместить текст на картинке по центру или прижатым в право средствами PHP GD?

Все очень просто! Делаем все то же самое, только не выводим текст целиком, а выводим построчно. Рассчитываем ширину строки и сколько нужно отступить от левого края,чтобы строка была по центру или прижата к правой части, в зависимости от того, какое выравнивание. Ниже приведен PHP код с комментариями:

<?php
// Прописываем заголовок PNG-изображения
header('Content-type: image/png');

// Создаем изображение
$im = imagecreatetruecolor(600, 200);

// Шрифт текста
$font = 'arial.ttf';

// Размер шрифта
$font_size = 11;

// Ширина области для вывода текста
$width_text = 500;

// Длинный многострочный текст, который нужно разбить на строки нужной нам длины 
$text = "Здесь длинный многострочный текст. Давайте просто разобъем строку на массив и при переборе массива выясним, где длина строки выходит за рамку, там и поставим перенос строки.";

// Способ выравнивания текста
//$align = "left";
$align = "center";
//$align = "right";

// Создаем цвета, которые понадобятся
$blue = imagecolorallocate($im, 0x88, 0x88, 0xFF); // голубой
$black = imagecolorallocate($im, 0x00, 0x00, 0x00); // черный

// Заливаем изображение цветом
imagefill($im, 1, 1, $blue);

// Разбиваем наш текст на массив слов
$arr = explode(' ', $text);

// Возращенный текст с нужными переносами строк, пока пустая
$ret = "";

// Перебираем наш массив слов
foreach($arr as $word)
{
// Временная строка, добавляем в нее слово
$tmp_string = $ret.' '.$word;
// Получение параметров рамки обрамляющей текст, т.е. размер временной строки 
$textbox = imagettfbbox($font_size, 0, $font, $tmp_string);
// Если временная строка не укладывается в нужные нам границы, то делаем перенос строки, иначе добавляем еще одно слово
if($textbox[2] > $width_text)
$ret.=($ret==""?"":"\n").$word;
else
$ret.=($ret==""?"":" ").$word;
}

if($align=="left")
{
// Накладываем возращенный многострочный текст на изображение, отступим сверху и слева по 50px
imagettftext($im, $font_size ,0 , 50, 50, $black, $font, $ret);
}
else
{
// Разбиваем снова на массив строк уже подготовленный текст
$arr = explode("\n", $ret);
// Расчетная высота смещения новой строки
$height_tmp = 0;
//Выводить будем построчно с нужным смещением относительно левой границы
foreach($arr as $str)
{
// Размер строки 
$testbox = imagettfbbox($font_size, 0, $font, $str);
// Рассчитываем смещение
if($align=="center")
$left_x = round(($width_text - ($testbox[2] - $testbox[0]))/2);
else
$left_x = round($width_text - ($testbox[2] - $testbox[0]));
// Накладываем текст на картинку с учетом смещений
imagettftext($im, $font_size ,0 , 50 + $left_x, 50 + $height_tmp, $black, $font, $str); // 50 - это отступы от края
// Смещение высоты для следующей строки
$height_tmp = $height_tmp + 19;
}
}

// Выводим изображение в окне браузера
imagepng($im);

// Освобождает память занятую изображением 
imagedestroy($im);
?>
Обратите внимание, что шрифт arial.ttf должен лежать в этой же папке что и скрипт.
Что получится при выполнении данного PHP скрипта.

$align = "left";
PHP GD выравнивание многострочного текста по левому краю

$align = "center";
PHP GD выравнивание многострочного текста по центру

$align = "right";
PHP GD выравнивание многострочного текста по правом краю

PHP GD выравнивание многострочного текста


P.S.
Пока писал данную статью пришла на ум идея, как сделать выравнивание текста по ширине средствами PHP GD.
  1. Все тоже самое, как и в статье PHP GD перенос строки длинного текста, но не сразу наносим строки на картинку.
  2. Сперва разбиваем строку на массив слов, вычисляем ширину слов, исходя из этого получаем ширину пробелов (ширина области под текст - минус ширина слов, разделим на количество пробелов). Пробелов меньше чем слов на 1. Ширину слов можно вычислить, исходя из суммы ширины каждого слова, но я бы сделал проще, убрал из строки все пробельные символы и вычислил ширину строки без пробелов.
  3. Нанесение текста на картинку делаем пословно, рассчитывая смещение с учетом пробельной ширины.

Ребята, прошу вас уважать чужой труд!
При копировании данного материала, дайте ссылку на источник, это не сложно..
У страницы «PHP GD выравнивание многострочного текста» комментариев: 5
<b>Антон</b>
Антон
06 ноября 2013
Спасибо! То, что нужно. Есть еще вопрос. Если у меня шрифт другой и другого размера, то что указывать в $height_tmp = $height_tmp + 19;? Вместо 19 подобрать другое число?
<b>Андрей</b>
Андрей
06 ноября 2013
Можно взять двойную или 2,5 (если междустрочный интервал полуторный) высоту строки.
Высота = $testbox[3] - $testbox[1]
<b>Антон</b>
Антон
06 ноября 2013
Благодарю! Даже я разобрался!
<b>Андрей</b>
Андрей
11 декабря 2014
Искренне благодарю, за отличный пример. Искал уже готовые библиотеки для реализации похожей проблемы. Но нужно ещё сколь угодно большой текст вместить и по высоте на картинку (уменьшая размер шрифта) В итоге решил писать свою либу. Теперь хоть есть представление, как это всё делать. Слава что существует хоть такая функция imagettfbbox :)
<b>Игорь</b>
Игорь
09 ноября 2015
Отличный скрипт! Спасибо! Подскажите как рассчитать не только ширину текста для вписывания в картинку, но и размер шрифта? Необходимо так же вписать текст в картинку по высоте. Я пробовал подсчитать количество строк в тексте (в foreach($arr as $word)) и зная высоту области текста изменить шрифт, но в этом цикле уже нужен размер шрифта. Как быть? Спасибо!
Оставить свой комментарий

Код защиты от роботов

Меню сайта Mittelspiel - Создание сайтов в Челябинске
Популярное на сайте Mittelspiel - Создание сайтов в Челябинске
Скидка на создание сайта 10%

Свет веб дизана
Новые побеги - новая концепция современного веб дизайна  
 
 
Студия веб-дизайна Mittelspiel. Создание сайтов любой сложности. Челябинск
© Copyright 2003-2015
Веб-студия «Миттельшиль»

• Создание сайтов в Челябинске.
• Продвижение сайта

+7 951 814 55 66
+7 351 248 08 23


 
Яндекс.Метрика Рейтинг@Mail.ru Rambler's Top100