На генерируемых, средствами PHP (GDLib), изображениях часто приходится выводить текст. Иногда этот текст нужно выравнивать по-центру, от какой-либо точки или по правому краю. Размер текста, как правило, разного размера, поэтому необходимо выяснить размер текста в пикселях и отнять от точки вывода текста.
Список функций
Основные функции, которые понадобятся для выравнивания текста:
imagettfbbox
array imagettfbbox(float size, float angle, string fontfile, string text) — функция возвращает массив координат прямоугольника в который можно строго вписать надпись string text, размером float size, с наклоном float angle и шрифтомstring fontfile.
imagettftext
array imagettftext(resource image, float size, float angle, int x, int y, int color, string fontfile, string text) — функция вывода текста на изображение.
Пример-решение
На примере выведем текст относительно вертикальной линии. По левому краю, по центру и по правому соответственно.
<?php
// Прописываем заголовок PNG-изображения
header('Content-type: image/png');
// Создаем изображение
$im = imagecreatetruecolor(800, 180);
// За центр (по оси X) возьмем 400
$CENTER = 400;
// Шрифт текста
$FONT = 'ptserif.ttf';
// Создаем цвета
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);// белый
$gray = imagecolorallocate($im, 0xDD, 0xDD, 0xDD);// серый
$red = imagecolorallocate($im, 0x99, 0x33, 0x33);// красный
$green = imagecolorallocate($im, 0x33, 0x99, 0x33);// зеленый
$blue = imagecolorallocate($im, 0x33, 0x33, 0x99);// синий
// Заливаем изображение белым цветом
imagefill($im, 1, 1, $white);
// Рисуем линии
imageline($im, $CENTER, 0, $CENTER, 180, $gray);
imageline($im, 0, 60, 800, 60, $gray);
imageline($im, 0, 120, 800, 120, $gray);
/**
* Текст по левому краю, все очень просто.
*/
imagettftext($im, 11, 0, $CENTER, 20, $red, $FONT, 'Текст по ЛЕВОМУ краю');
imagettftext($im, 11, 0, $CENTER, 50, $red, $FONT, 'Текст тоже по ЛЕВОМУ краю');
/**
* Текст по центру.
*/
// размеры текст по координатам
$box = imagettfbbox(11, 0, $FONT, 'Текст по ЦЕНТРУ');
// размер отступа влево, чтобы текст оказался посередине заданной точки
$left = $CENTER-round(($box[2]-$box[0])/2);
imagettftext($im, 11, 0, $left, 80, $green, $FONT, 'Текст по ЦЕНТРУ');
// текст по центру №2
$box = imagettfbbox(11, 0, $FONT, 'Этот очень важный текст выровнен по ЦЕНТРУ');
$left = $CENTER-round(($box[2]-$box[0])/2);
imagettftext($im, 11, 0, $left, 110, $green, $FONT, 'Этот очень важный текст выровнен по ЦЕНТРУ');
/**
* Текст по правому краю
* Почти так же как и "по центру" только делить на 2 не нужно отступ влево
*/
$box = imagettfbbox(11, 0, $FONT, 'Текст по ПРАВОМУ краю');
$left = $CENTER-($box[2]-$box[0]);
imagettftext($im, 11, 0, $left, 140, $blue, $FONT, 'Текст по ПРАВОМУ краю');
$box = imagettfbbox(11, 0, $FONT, 'Этот очень важный текст выровнен по ПРАВОМУ краю');
$left = $CENTER-($box[2]-$box[0]);
imagettftext($im, 11, 0, $left, 170, $blue, $FONT, 'Этот очень важный текст выровнен по ПРАВОМУ краю');
// Выводим изображение
imagepng($im);
?>