Принтабельные ссылки
[04.09.2005]

Сегодня напишем на модном javascript’e приблуду, добавляющую в версии для печати ко всем ссылкам в тексте их href’ы.

ЧПУ без mod_rewrite
[03.09.2005]

Пишем систему для реализации человеко-понятного URL’я. Данный способ предназначен только для извращенцев и тех, у кого на хостинге отсутствует поддержка модуля mod_rewrite. Описанная система работает на даном сайте уже около двух лет.

Фотомонтажим на PHP
[10.04.2005]

Возвращаясь к теме работы с изображениями в PHP, рассмотрим реализацию «смешивания» изображения из нескольких картинок, и способы практического применения такого трюка.

Отправка и обработка ответов http-запросов с помощью JavaScript (использование объекта XMLHttpRequest)
[22.03.2005]

Разберёмся с возможностями, которые предоставляет нам объект XMLHttpRequest. Попробуем реализовать на JavaScript работу с удаленным сервером посредством прямой отправки http-запросов и обработкой ответов.

Работа с мышиным курсором в JavaScript. Часть третья.
[25.07.2004]

Сегодня мы продолжим издеватся над несчастным мышиным курсором и попытаемся создать эффект «волшебной палочки», из которой сыплются частицы «волшебной пыли».

Работа с изображениями в 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