PHP-4 Эффективная работа


Установка средств графической поддержки
Функции поддержки работы с графикой
Небольшие графические объекты

Как известно, популярность Web не в последнюю очередь обусловлена его внешней привлекательностью — огромным количеством картинок и фонов, завлекающих и развлекающих пользователей. Среди них динамический HTML, оперирующий преимущественно текстом, выглядит достаточно убого. Конечно, нет никаких препятствий к тому, чтобы включить в генерируемый HTML-файл ссылку на готовую картинку, но... хотелось бы чего-то большего.

Прежде всего хотелось бы иметь возможность создавать картинки «на лету», анализируя содержимое баз данных на сервере, то есть получить некоторое подобие Crystal Report. Во-вторых, хотелось бы иметь возможность создавать изображения в стандартных для WWW-пространства форматах — gif, png, jpeg. И наконец, хотелось бы иметь возможность помещать в генерируемые иллюстрации тексты, и при этом тексты на русском языке.

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

При этом по ходу изложения я постараюсь разбавить сухое описание функций примерами их практического применения.

17.1. Установка средств графической поддержки

Все функции графической поддержки в РНР, рассматриваемые в этой главе, ориентированы на графическую библиотеку 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, и можете приступать к созданию собственных картинок.

17.2.Функции поддержки работы с графикой

В этом разделе мы детально рассмотрим все функции, активизируемые РНР-машиной при подключении библиотеки 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() возвращает новое изображение, созданное из уже существующего потока, представленного в виде строки. Фактически можете рассматривать эту функцию как «размножитель» потоков изображений.

назад
далее

Сайт управляется системой uCoz