Установка средств графической поддержки
Функции поддержки работы с графикой
Небольшие графические объекты
Как известно, популярность Web не в последнюю очередь обусловлена его внешней привлекательностью — огромным количеством картинок и фонов, завлекающих и развлекающих пользователей. Среди них динамический HTML, оперирующий преимущественно текстом, выглядит достаточно убого. Конечно, нет никаких
препятствий к тому, чтобы включить в генерируемый HTML-файл ссылку на готовую картинку, но... хотелось бы чего-то большего.
Прежде всего хотелось бы иметь возможность создавать картинки «на лету», анализируя содержимое баз данных на сервере, то есть получить некоторое подобие
Crystal Report. Во-вторых, хотелось бы иметь возможность создавать изображения в стандартных для WWW-пространства форматах — gif, png, jpeg. И наконец,
хотелось бы иметь возможность помещать в генерируемые иллюстрации тексты,
и при этом тексты на русском языке.
К счастью, сегодня все эти проблемы решаются, хотя и с применением некоторой
доли ручного труда администратора, но все же достаточно просто. В этой главе мы
детально рассмотрим, как легко и непринужденно включить в генерируемые вами
страницы «средства графического оформления».
При этом по ходу изложения я постараюсь разбавить сухое описание функций
примерами их практического применения.
Все функции графической поддержки в РНР, рассматриваемые в этой главе, ориентированы на графическую библиотеку GD, которую вам придется извлекать из
сети и устанавливать отдельно. Найти ее можно по адресу http://www.boutell.com/gd.
На момент написания книги на сервере присутствовало две версии: стабильная
1.8.4 и 3-версия 2.0.1. Но поскольку в наши задачи не входит перманентное вылав-
ливание чужих ошибок, я настоятельно рекомендую использовать стабильные версии. После распаковки библиотеки она устанавливается достаточно прозрачно:
. /configure
make
male install
Но, как вы догадываетесь, это не наш путь! Дело в том, что по умолчанию в библиотеке используются англоязычные шрифты (вернее, кодировка ISO8859-2), которые не содержат букв кириллицы. Но такой хоккей нам не нужен! Поэтому нам
потребуется модифицировать исходный текст библиотеки, поместив туда русскоязычные шрифты в кодировке КОИ-8.
примечание
Закоренелых поклонников Билла Гейтса отправляю за консультациями в сервисную службу
компании Microsoft. Доброжелательные и квалифицированные специалисты охотно подскажут вам, как реализовать динамическую генерацию изображений в РНР для Windows.
В состав библиотеки GD входит утилита bdftogd, которая как раз и предназначена для подготовки шрифтов в формате, требуемом библиотекой. Как и следует из
названия программы, для ее работы нам потребуются шрифты в BDF-формате,
причем не какие попало, а моноширинные, аналогичные тем, которые используются в текстовых режимах работы видеоадаптеров.
Наилучшими на сегодняшний день являются шрифты, разработанные Дмитрием
Болохвитяновым в рамках проекта Cyr-RFX (http://www.inp.nsk.su/~bolkhov). Имейте
в виду, что вам необходим не сам пакет, а его исходные тексты в формате BDF.
После их загрузки вам необходимо перенести в отдельный каталог несколько моноширинных шрифтов. В приведенном ниже примере я постарался указать шрифты,
которые в максимальной степени совпадают с использованными в оригинальной
библиотеке:
#!/b1n/sh
#
# - make-gd-fonts -
# Программа создания шрифтов для библиотеки GD из BDF-описаний.
# За основу взяты шрифты из пакета
# Cyr-RFX Дм. Болховитянова
# (www.inp.nsk.su/~bolkhov)
#
# (С) В.Водолазкий. 2001, Москва
#
# Предполагается, что шрифты из каталога misc (моноширинные)
# находятся в текущем каталоге. После генерации файлов .с и .h
# скопируйте их вместо стандартных файлов в исходных текстах
# библиотеки GD-1.8.4.
#
bdftogd FontGiant gdfontg < 9xl5Bk.bdf
bdftogd FontLarge gdfontl < 9xl5k.bdf
bdftogd FontMediumBold gdfontmb < 8xl3Bk.bdf
bdftogd FontSmall gdfonts < 6xl3k.bdf
bdftogd FontTiny gdfontt < 5x7k.bdf
Как видите, фактически поддержка текста в GD предполагает использование пяти
кеглей (размеров) шрифтов. Мы ограничились четырьмя из них, и «гигантский» шрифт
отличается от «большого» только тем, что он полужирный. В результате выполнения
этого сценария будут сгенерированы исходные тексты (.с и .h) описаний шрифтов,
которые затем копируются в каталог с исходными текстами библиотеки GD. После этого вам остается только скомпилировать и установить ее, как описано выше.
Следует иметь в виду, что из-за жадности буржуев, внезапно воспылавших любовью к GIF-формату, в последних версиях библиотеки GD поддержка GIF отсутствует. Но, по большому счету, ничто не мешает использовать PNG или JPEG.
Правда, для поддержки последнего вы должны компилировать GD и РНР-машину с поддержкой JPEG, а также установить библиотеку jpeg-6b. В подавляющем
большинстве дистрибутивов она присутствует изначально, но вы можете найти ее
исходные тексты по адресу ftp://ftp.uu.net/graphics/jpeg/.
Кроме того, вам потребуется внести несколько корректив в сборочный файл Makefile,
обеспечивающий компиляцию GD. Впрочем, все необходимые изменения легко
выявляются из комментариев.
Теперь можно приступать к перекомпиляции PHP-машины. В принципе достаточно только добавить в запрос конфигуратора опции
--with-gd --with-jpeg-di r=/usr/src/jpeg-6b
и заново собрать PHP-машину. Но есть одна тонкость! Вне зависимости от того,
будете ли вы использовать TTF-шрифты или нет, вы должны установить библиотеку libttf, которую можно найти на сайте www.freetype.org. Без этого компиляция
PHP-машины завершится ошибкой, поскольку, по непонятной причине, интерфейсы РНР и GD используют заголовочные и библиотечные файлы freetype. С одной стороны, это говорит о популярности TTF-шрифтов, с другой — вынуждает
грузить дополнительное программное обеспечение.
Затем вы повторяете процедуру сборки и установки PHP-машины в составе сервера Apache, как рассмотрено в главе 1, и можете приступать к созданию собственных картинок.
В этом разделе мы детально рассмотрим все функции, активизируемые РНР-машиной при подключении библиотеки GD.
17.2.1. Создание изображения
17.2.1.1. Создание изображения: ImageCreate
int imagecreate (int x_size, int y_size)
Это наиболее часто используемая функция для создания «заготовки» изображения, которое будет затем использоваться для заполнения. Аргументы функции
определяют размер картинки, а конкретный формат данных будет задан при ее
сохранении в выходном потоке.
Конечно, выходной формат должен быть согласован с генерируемым заголовком,
как это показано ниже:
<?php
header ("Content-type: image/png");
$im = @ImageCreate (50, 100)
or die ("He могу создать поток GD");
$background_color = ImageColorAl.locate ($im, 255, 255, 255);
$text_color = ImageColorAllocate ($im, 233, 14, 91);
ImageString (Sim, 1, 5, 5, "Всем привет от GDI", $text_color);
ImagePng (Sim);
17.2.1.2. Загрузка GIF-файла: ImageCreateFromGIF
int imagecreatefromgif (string filename)
Функция ImageCreateFromGif () возвращает идентификатор изображения, получен-
ного из заданного GIF-файла. В случае ошибки функция возвращает пустую строку.
Кроме того, будет сгенерировано сообщение об ошибке, но радости это вам не доставит — ведь заголовок указывает на картинку! Попытка просмотра исходного
текста такой картинки в Netscape Navigator для Linux приводит к его аварийному
завершению, поэтому при отладке сценариев рекомендую использовать Konquerior.
Для отладки процесса загрузки файла можно воспользоваться также приведенной
ниже функцией, которую я позаимствовал из документации к РНР:
function LoadGif ($imgname) {
$im = @ImageCreateFromGIF ($imgname);
// Вначале просто пытаемся открыть файл
if (!$im) { // А если это не удалось...
$im = ImageCreate (150, 30); /* Создаем пустышку */
$bgc = Imag-eColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle (Sim, 0, 0, 150, 30, $bgc);
/* И вносим туда текст */
ImageString($im, 1, 5, 5,
"Ошибка при загрузке $imgname", Stc);
}
return $im;
}
Есть еще одна тонкость: поскольку поддержка GIF исключена из GD, начиная с
версии 1.6 воспользоваться этой функцией может оказаться затруднительным.
Поэтому не стоит особо рассчитывать на ее работоспособность... Впрочем, по моему личному убеждению, век GIF уже прошел.
17.2.1.3. Создание картинки из JPEG-файла:ImageCreateFromJPEG
int imagecreatefromjpeg (string filename)
Функция ImageCreateFromJPEG( ) возвращает идентификатор изображения, полученного из заданного JPEG-файла. В случае ошибки функция возвращает пустую строку.
примечание
Как и в случае с GIF, будет сгенерировано сообщение об ошибке, а попытка просмотра
исходного текста такой картинки в Netscape Navigator для Linux приведет к его аварийному завершению. Так что опять рекомендую использовать при отладке Konquerior.
Кроме того, для отладки процесса загрузки файла можно воспользоваться приведенной ниже функцией, аналогичной рассмотренной в предыдущем разделе:
function LoadJpeg ($imgname) {
$im = @ImageCreateFromJPEG ($imgname);
// Вначале просто пытаемся открыть файл
if (!$im) { // А если это не удалось...
$im = ImageCreate (150, 30); /* Создаем пустышку */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* И вносим туда текст */
ImageString($im, 1, 5, 5,
"Ошибка при загрузке $imgname", $tc);
}
return $im;
Необходимо лишь позаботиться о том, чтобы PHP-машина и GD были скомпилированы с поддержкой JPEG.
17.2.1.4. Создание картинки из PNG-файла: ImageCreateFromPNG
int imagecreatefrompng (string filename)
Функция ImageC reateF romPNG () возвращает идентификатор изображения, полученного из заданного PNG-файла. В случае ошибки функция возвращает пустую
строку.
Кароме того, для отладки процесса загрузки файла можно воспользоваться приведенной ниже функцией, аналогичной рассмотренным в предыдущих разделах:
function LoadPNG ($imgname) {
$im = @ImageCreateFromPNG ($imgname);
// Вначале просто пытаемся открыть файл
if (!$im) { // А если это не удалось...
$im = ImageCreate (150, 30); /* Создаем пустышку */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* И вносим туда текст */
ImageString($im, 1, 5, 5,
"Ошибка при загрузке $imgname", $tc);
}
return $im;
}
Как видите, эта функция, по большому счету, ничем не отличается от рассмотренных ранее. При небольшой доле изобретательности вы можете объединить все три
функции в одну, если воспользуетесь анализатором параметров файла, описанным
в разделе 17.2.2.1. Но я оставляю ее реализацию в качестве домашнего задния.
примечание
Подсказка для начинающих; наряду с анализом типа файла вам необходимо также про-
верить, поддерживается ли данный тип файла в в вашей РНР-машине.
17.2.1.5. Создание картинки из BMP-файла: ImageCreateFromWBMP
int imagecreatefromwbmp (string filename)
Функция ImageCreateFromWBMP() возвращает идентификатор изображения, полученного из заданного BMP-файла. В случае ошибки функция возвращает пустую строку и генерируется сообщение об ошибке.
Кроме того, для отладки процесса загрузки файла можно воспользоваться приведенной ниже функцией, аналогичной рассмотренным в предыдущих разделах:
function LoadBMP ($imgname) {
$im = @ImageCreateFromWBMP ($imgname);
// Вначале просто пытаемся открыть файл
if (!$im) { // А если это не удалось...
$im = ImageCreate (150, 30); /* Создаем пустышку */
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
/* И вносим туда текст */
ImageString($im, 1, 5, 5,
"Ошибка при загрузке $imgname", $tc);
}
return $im;
}
17.2.1.6. Создание картинки из строки: ImageCreateFromString
int imagecreatefromstring (string image)
Функция ImageCreateFromString() возвращает новое изображение, созданное
из уже существующего потока, представленного в виде строки. Фактически можете рассматривать эту функцию как «размножитель» потоков изображений.
|