Оглавление

28.7. Вывод текста в изображение. Создаем счетчик посещений

Для вывода текста используются следующие функции:

□ imagechar() рисует символ на изображении по горизонтали:
imagechar(<Идентификатор>, <Шрифт>, <X>, <Y>, <Символ>, <Цвет>);
□ imagecharup() рисует символ на изображении по вертикали:
imagecharup(<Идентификатор>, <Шрифт>, <X>, <Y>, <Символ>, <Цвет>);
□ imagestring() отображает строку на изображении по горизонтали:
imagestring(<Идентификатор>, <Шрифт>, <X>, <Y>, <Строка>, <Цвет>);
□ imagestringup() отображает строку на изображении по вертикали:
imagestringup(<Идентификатор>, <Шрифт>, <X>, <Y>, <Строка>, <Цвет>);

 

В этих функциях параметр <Шрифт> задает размер встроенного шрифта, который выражается числом от 1 до 5.
Все  четыре  функции  с  буквами  русского  языка  не  работают. Для  русского языка  следует  использовать TrueType-шрифты (например, arial.ttf).  В Windows XP  шрифты  расположены  в  папке C:\Windows\Fonts.  Для  работы  с TrueType-шрифтами используются следующие функции:

□ imagettftext()  рисует  строку  на  изображении TrueType-шрифтом. Функция  возвращает  массив  координат 4-х  вершин  прямоугольника,  в который будет  вписан  текст. Вершины перечисляются в следующем порядке:  нижняя  левая,  нижняя  правая,  верхняя  правая,  верхняя  левая.
Формат вызова функции:
imagettftext(<Идентификатор>, <Размер>, <Угол>, <X>, <Y>, <Цвет>, <Шрифт>, <Строка>);
Параметры имеют следующий смысл:
•  <X> и <Y> — координаты левой крайней точки базовой линии;
•  <Размер> — размер шрифта;

•  <Угол> —  угол  поворота  текста. Угол 0  соответствует  обычному  горизонтальному расположению текста, а поворот осуществляется против часовой стрелки;
•  <Шрифт> — имя файла со шрифтом.


Например, следующий код

$img = imagecreate(200, 200);
$red = imagecolorallocate($img, 255, 0, 0);
$black = imagecolorallocate($img, 0, 0, 0);
$text = 'Testing...';
$fontfile = "C:/WINDOWS/Fonts/arial.ttf";
$arr = imagettftext($img, 20, 0, 11, 21, $black, $fontfile, $text);
print_r($arr);


выведет в PHP 5.2  (1)
Array ( [0] => 12 [1] => 27 [2] => 115 [3] => 27 [4] => 115  [5] => 2 [6] => 12 [7] => 2 )

 

Это означает, что текст вписан в такой прямоугольник:
•  12, 27 — координаты левого нижнего угла;
•  115, 27 — координаты правого нижнего угла;
•  115, 2 — координаты правого верхнего угла;
•  12, 2 — координаты левого верхнего угла;


□ imagettfbbox() возвращает координаты прямоугольника, в который вписана строка с помощью TrueType-шрифта;
imagettfbbox(<Размер>, <Угол>, <Шрифт>, <Строка>);
Например, такой код

$text = 'Testing...';
$fontfile = "C:/WINDOWS/Fonts/arial.ttf";
$arr = imagettfbbox(20, 0, $fontfile, $text);
print_r($arr);

 

 

выведет в PHP 5.2   (1)
Array ( [0] => 0 [1] => 5 [2] => 103 [3] => 5 [4] => 103  [5] => -20 [6] => 0 [7] => -20 )

 

Это  означает,  что  заданный  текст,  выведенный  под  заданным  углом  таким шрифтом  и  размером,  помесится  в  прямоугольник  со  следующими координатами:
•  0, 5 — левый нижний угол;
•  103, 5 — правый нижний угол;
•  103, -20 — правый верхний угол;
•  0, -20 — левый верхний угол.

 

В  качестве  примера  создадим  счетчик посещения  с использованием cookies  и выведем результат в графическом виде (листинг 66).

 
Листинг 66. Счетчик посещений

<?php
if (!isset($_COOKIE['id_count'])) $id_count = 0;
else $id_count = $_COOKIE['id_count'];
$id_count++;
setcookie('id_count', $id_count, 0x6FFFFFFF);
header("Content-type: image/png");
$img = imagecreate(88, 31);
$white = imagecolorallocate($img, 255, 255, 255);
$grey = imagecolorallocate($img, 128, 128, 128);
$black = imagecolorallocate($img, 0, 0, 0);
imagerectangle($img, 0, 0, 87, 30, $black);
$fontfile = 'C:/Windows/Fonts/arial.ttf';
$str = 'Мой счетчик';
$str = iconv("windows-1251", "UTF-8", $str);
imagettftext($img, 8, 0, 11, 13, $grey, $fontfile, $str);
$mass = imagettfbbox(12, 0, $fontfile, $id_count);
$width = intval((88 - $mass[2])/2);
imagettftext($img, 12, 0, $width, 27, $grey, $fontfile, $id_count);
imagepng($img);
imagedestroy($img);
?>

 

 

При использовании русских букв могут возникнуть проблемы, по  этой причине мы преобразуем текст из кодировки windows-1251 в UTF-8 при помощи функции iconv(). Попробуйте обновить страницу, цифры на счетчике будут увеличиваться.

 

При  выводе  текста  на  готовое  изображение  возможны  проблемы  с  цветом текста. Особенно это проявляется при использовании изображений в формате GIF, так как количество цветов ограничено числом 256. Если попытаться добавить новый цвет при максимальном количестве цветов в палитре, функция imagecolorallocate() вместо идентификатора цвета вернет значение false, а цвет текста будет соответствовать цвету фона. Один из способов решения этой проблемы заключается в использовании функции imagecolorclosest(), которая возвращает ближайший цвет, имеющийся в палитре (листинг 67).

 
Листинг 67. Вывод текста на готовое изображение

<?php
$img = imagecreatefromgif('foto.gif');
header('Content-type: image/gif');
$white = imagecolorallocate($img, 255, 255, 255);
if ($white !== false) {
   $str = 'Точный цвет';
}
else {
   $white2 = imagecolorclosest($img, 255, 255, 255);
   $str = 'Ближайший цвет';
}
$fontfile = 'C:/WINDOWS/Fonts/arial.ttf';
$str = iconv("windows-1251", "UTF-8", $str);
imagettftext($img, 28, 0, 100, 400, $white2, $fontfile, $str);
$str = 'Точный цвет';
$str = iconv("windows-1251", "UTF-8", $str);
imagettftext($img, 28, 0, 140, 440, $white, $fontfile, $str);
imagegif($img);
imagedestroy($img);
?>

 

Итак, мы выводим на изображение две строки. Первая строка выводится цветом, ближайшим к указанному цвету в палитре. Вторая строка демонстрирует цвет  текста,  если  бы  мы  не  использовали  функцию  imagecolorclosest().  Результат выполнения листинга изображен на рис. 2.

 

Вывод текста в картинке

Рис. 2. Вывод текста на готовое изображение

 

 

INDOWS
Примечания:
  • В PHP 5.3.0 функция возвращает некорректный результат. В PHP 5.3.2-dev (от 14 ноября 2009 г.) ошибка была устранена, но результат все равно отличается от результата в PHP 5.2.
  • Две координаты по Y имеют отрицательные значения. Это происходит потому, что началом координат считается левая точка базовой линии. Базовая линия — это линия, соприкасающаяся с большинством букв снизу. Части некоторых букв могут быть расположены ниже базовой линии (например, буква "y"). Все, что расположено ниже базовой линии, имеет положительные координаты Y, а все, что выше — отрицательные. Кроме того, отрицательные значения может иметь и координата X.
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити