Работа с изображениями в PHP (часть вторая)
Версия для печати | Содержание раздела
Продолжая тему, сегодня поговорим о шрифтах и работе с текстом в изображениях и разберемся, как писать в графике «по-русски».
В прошлый раз мы научились основам, а также рисованию простых картинок в PHP с помощю библиотеки GD.
Однако чаще всего на практике приходится не столько работать с функциями рисования, сколько манипулировать готовыми изображениями. Например, часто таким образом делаются графические кнопки для оформления навигационых меню или кнопки для форм. Или, скажем, «нашлепываются» водяные знаки и копирайты на фотографии или картинки. Словом, найти применений можно массу, осталось разобраться в имеющихся средствах.
Работа с текстом
Обычно работа с графическим текстом в PHP заключается в выводе надписей. Для этого в PHP имеется довольно богатый арсенал функций. Во-первых, это функции вывода строк: imagestring() и imagestringup(). Во-вторых, это функция вывода текста (различие между текстом и строкой станет ясно через несколько мгновений) imagettftext().
Итак, в чем же различия между графической строкой и текстом в представлении PHP?
Основное, как мне кажется, различие здесь заключается в том, что функция imagestring() работает лишь со встроенными пиксельными (битовыми) шрифтами, (есть конечно возможность подключения собственных шрифтов, но об этом позже) а функция же imagettftext(), как следует уже из её названия, умеет работать с обычными ttf-шрифтами, коих навалом в папке Fonts у любого веб-программера (и вообще, у любого...).
Отсюда следует также, что существует несколько особенностей, реализованых в функциях вывода строки, и отсутствующих в функции вывода текста, и наоборот.
Например, одним из параметров функции imagettftext() задается угол наклона базовой линии, по которой будет выводится текст. Это конечно же расширяет поле деятельности любителей пописáть на картинках. С другой стороны, imagestring() может выводить маленькие и аккуратные надписи (скажем, для легенды на графике), что не под силу imagettftext() (мелкий текст там «мылится»).
Что ж, давайте прикинем возможные варианты применения текста в графике:
- Создание художественных надписей и заголовков
- Нанесение водяных знаков и копирайтов
- Вывод технических надписей на графиках, планах, картах и пр.
Слева вы можете видеть пример работы обоих наших функций. Чёрные надписи сделаны с помощью функции imagettftext(), красные — функциями imagestring() и imagestringup().
Я думаю, вы уже заметили вышеназванные особенности обоих способов (возможность поворота первых и четкость последних). Однако обратите внимание, что делать надписи на русском языке можно обеими функциями. Об этом чуть ниже, для начала поговорим о синтаксисе обеих наших функций.
Итак, функция imagestring():
imagestring(image, font, x, y, s, col)
Параметр image — это привычный нам идентификатор изображения (image identifier — см., если что, «Работа с изображениями в PHP (часть первая)»). Параметр font — это число, указывающее шрифт для вывода. При этом числа от 1 до 5 зарезервированны под встроенные шрифты. Остальные могут отдаваться под определяемые пользователем (это и есть ключ к работе с кириллицей, однако ещё минутку терпения). Далее: x и y — это, естественно, координаты размещения строки (привязка по верхнему левому углу габаритов), а s — собственно, сама строка для вывода (обратите внимание, что вывод в данном случае происходит только в одну строку). Последняя же переменная, col, определяет цвет выводимого текста (используется значение, возвращаемое функцией imagecolorallocate())
Вторая функция — imagettftext():
imagettftext(image, size, angle, x, y, col, fontfile, text)
Рассмотрим только параметры, не упоминавшиеся в прошлой функции (их типы и предназначение аналогичны). Итак, size — размер шрифта текста в пикселях, angle — угол наклона текста в градусах (0 — нормальный горизонтальный вывод слева направо, 90, к примеру — снизу вверх, и так далее по кругу против часовой стрелки). Параметр fontfile — путь к самому .ttf файлу шрифта и, наконец, text — строка, представляющая выводимый текст. Я говорю «текст», так как функция предусматривает возможность переноса строк, тоесть удобна для вывода именно текста. Для переноса нужно вставить последовательность символов \n\r (перенос строки и возврат каретки).
Вывод надписей кириллицей
Итак, теперь самое интерестное. Любой, кто пробовал засандалить в функцию imagestring() русский текст, сталкивался с хорошо известной обидной кракозяброй. Дело в том, что встроенные в PHP шрифты не имеют региональной части символов (в нашем случае — кириллицы).
Так как же выводить в PHP русские символы? Для этого, как уже все догадались, нужны собственные шрифты, с полной символьной таблицей. Для функции imagettftext() это, в общем-то, не проблема — нужно просто найти подходящий шрифт.
А вот для работы со своими шрифтами в imagestring() нужно будет для начала создать шрифт (в специальном формате), а потом — загрузить его специальной функцией imageloadfont(file): единственный её параметр — это строка с путём к файлу.
Основной вопрос, где достать этот шрифт... Для предаставления шрифта в библиотеке GD используется специальный формат. Заинтересовавшиеся смогут легко найти его описание в руководстве по PHP. Однако, его нам сейчас знать совсем необязательно, так как существует множество утилит-редакторов, и конверторов, которые позволяют создать самому нужный PHP-шрифт, или же сконвертировать какой-либо из имеющихся шрифтов.
Утилитку эту (PHP Font Editor) вы можете найти в разделе Файлов. Она очень легка в использовании, я думаю, у вас не возникнет проблем в работе с ней.
Как только вы получили нужный файл (для теста можете использовать этот шрифт, нарисованный мной в вышеназванной утилите), его нужно подключить, и можно выводить тексты. Вот пример кода, результатом которого есть картинка, приведенная выше:
$img = imageCreate(200, 200);
$black = imageColorAllocate($img, 0, 0, 0);
$white = imageColorAllocate($img, 255, 255, 255);
$mf = imageloadfont ('myfont.phpfont');
imageFill($img, 1, 1, $white);
imagettftext($img, 20, 0, 10, 20, $black, "../arial.ttf",
"Here is PHP text!");
imagettftext($img, 10, 5, 50, 50, $black, "../arial.ttf",
"PHP Says: «Hello, World!»");
imagettftext($img, 14, 45, 40, 160, $black, "pixcyr2.ttf",
"Текст с переносами.\n\r
Перед вами\n\r
кириллический шрифт\n\r
под углом 45\n\r
градусов");
imagestring($img, $mf, 20, 60, "Ещё одна PHP", $red);
imagestring($img, $mf, 20, 73, "строка", $red);
imagestringup($img, 2, 170, 180, "Alternative", $red);
imagestringup($img, 2, 182, 180, "text strings", $red);
imagePNG($img);
Ну, вот на этом вкратце и всё. Вопросы, советы и всё остальное как всегда принимаются.
При написании статьи было использовано руководство по PHP
В примерах использована GD-библиотека версии 1.6.2
Продолжение следует...
7.12.2004
|