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


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

17.2.7.5. Заливка: ImageFiil

int imagefill (int im. int x, int y, int col)

Функция ImageFi11 () осуществляет заливку области начиная с точки (х, у) цветом, зарегистрированным под индексом col.

17.2.7.6. Мноугольник с заливкой: ImageFilledPolygon

int imagefilledpolygon (int im, array points, int num_points, int col)

Функция предназначена для отрисовки многоугольника с заливкой. Массив points содержит координаты полигона, при этом points[0] = xO, points[l] = yO, points[2] = = xl, points[3] = yl и т. д. Аргумент num_poi nts должен содержать количество точек многоугольника.

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

Исходный код моей программы приведен в листинге 17.11, а результат ее выполнения представлен на рис. 17.8.

Листинг 17.11. Отрисовка правильного шестиугольника (пример использования функции ImageFilledPolygon) <?php // poligon.php - Прорисовка шестигранника (сота)
// Функция вывода правильного шестиугольника. Основана
// на тригонометрии 7 класса общеобразовательной школы
// Аргументы:
// $im - идентификатор изображения
// $х,$у - координаты центра гексагона
// $R - радиус описывающей окружности
// $till - цвет заливки
// $contur - цвет контура

function Hexagon($im, $x, $y, $R, $fill,$contur) {
       $h = $R*1.73/2; // Высота базового треугольника
       // Рассчитываем координаты опорных точек и сразу заталкиваем
       // их в массив, используемый для вывода
       $а[0] = $х - $R; $а[1] = $у;
       $а[2] = $х - SR/2; $а[3] = $у- $h;
       $а[4] = $х + $R/2; $a[5] = $а[3];
       $а[6] = $х + $R; $a[7] = $у;
       $а[8] = $а[4] ; $а[9] = $у + $И;
       $а[10] = $а[2] ; $а[11] = $а[9] ;

// Теперь отрисовываем залитый полигон
       ImageFilled Polygon($im,$a,6,$till);
// А потом обводим его контуром
       ImagePolygon($im,$a,6,$contur);
}
$image = imageCreate(600,250) ;
header("Content-type: image/png");

$black = ImageColorAllocate($image,0,0,6);
$white = ImageColorAllocate($image,255,255,255);
$yellow = ImageColorAllocate($image,255,255,10) ;
$lemon = ImageColorAllocate($image,40,240,223);

ImageFilledRectangle($image,0,0,600,400,$white);

Hexagon ($ image, 50, 50, 30, $yeUow,$black);
Hexagon($image,250,80,85,$white,$black);
Hexagon($image,450,120,60,$lemon,$black);

// отправляем картинку на машину клиента
imagepng($image);
?>

Рис. 17.9. Использование функции ImageFilledPolygon для вывода изображения правильного шестиугольника

17.2.7.7. Прямоугольник с заливкой: ImageFilledRectangle

int imagefilledrectangle (int im, int xl, int yl,
                                             int x2, int y2,
                                             int col)

Функция ImageFilledRectangle () отрисовывает прямоугольник с граничными координатами (xl, у 1) — (х2, у2), залитый цветом с индексом col. Точкой отсчета изображения является левый верхний угол.

В принципе, эта функция не слишком отличается от рассмотренной выше ImageFi lledPolygon и даже может рассматриваться как ее частный случай. Однако при построении гистограмм ее использовать гораздо проще и удобнее.

17.2.7.8. Заливка до границы: ImageFHIToBorder

int imagefilltoborder (int im, int x, int y,
                                               int border, int col)

Функция ImageFillToBorder() производит заливку области, окружающей точку (х, у) вплоть до границы, заданной цветом col.

17.2.7.9. Отрисовка линии: ImageLine

int imageline (int im, int xl, int yl, int x2, int y2. int col)

Функция ImageLine () прорисовывает линию от (xl, yl) до (х2, у2) цветом с индексом col. Началом координат является верхний левый угол изображения.

См. также описание функций ImageCreate() (раздел 17.2.1.1) и ImageColorAllocate() (раздел 17.2.6.1).

17.2.7.10. Отрисовка полигона: ImagePolygon

int imagepolygon (int im, array points, int num_points, int col)

Функция ImagePolygon() отрисовывает в изображении im многоугольник. Мас- сив points содержит координаты точек, его образующих: points[0] - хО, points[ 1 ] = = уО, points[2] = xl, points[3] = yl и т. д. Аргумент num_poi nts определяет общее количество отрисовываемых точек, a col — цвет, которым будет выполнен рисунок.

17.2.7.11. Отрисовка прямоугольника: ImageRectangle

int imagerectangle (int im, int xl, int yl, int x2, int y2, int col)

Функция ImageRectangle() отрисовывает в изображении im прямоугольник, ограниченный координатными парами (xl, yl) — (х2, у2). Цвет прямоугольника задается аргументом col.

17.2.7.12. Отрисовка точки: ImageSetPixel

int imagesetpixel (int im, int x, int y, int col)

Функция ImageSetPixel()Q рисует пиксел с координатами (х, у) в изображении im цветом col. За начало координат в библиотеке GD принят верхний левый угол холста.

См. также описание функций ImageCreate() (раздел 17.2.1.1) и ImageColorAllocate() (раздел 17.2.6.1).

17.3. Небольшие графические проекты

Теперь, после того как вы затратили столько сил на освоение функций, описанных в предыдущем разделе, имеет смысл познакомиться с парой практических примеров использования этих функций.

17.3.1. Кнопка-прототип

При создании интерактивных систем на основе Интернет/Интранет-технологии одним из самых распространенных средств управления является экранная кнопка. При этом речь не идет о кнопке из экранной формы. Часто кнопка используется в качестве картинки, за которой скрывается обычная гипертекстовая ссылка.

Проблема заключается в том, что эти картинки надо рисовать. Я, как правило, использую простую программу Button Studio под Windows, с помощью которой создаю JPEG-изображения кнопок. А потом я синтезирую кнопку и ссылку с помощью следующей конструкции:

// Генерация текста кнопки, построенной на базе файла картинки
// Поскольку предпочтение отдается бесфреймовой модели, параметр
// target не используется
//
// $href - адрес ссылки, вызываемой при нажатии на кнопку
// $piel - картинка с изображением кнопки
// $alt - выпадающая "сопля" с подсказкой
//
function button($href,$piel,$alt="")
{
       echo "<a href=\"$href\"><img src=\"/buttons/$picl\" border=0\n";
       if ($alt) {
          echo " alt =\"$alt\"\n";
          }
          echo " style='cursor:hand'></a>\n";
}
Использование этой функции позволяет сэкономить массу времени:

<b>Информационное хранилище</b>
<table>
<TR>
<td>
<? button("/menu/demon.php","demon, jpg",
                 "Демон сбора данных"); ?>
</td><tr><td>
<? button("/menu/rawdata.php","rawdata. jpg",
                 "Загруженные из сети данные для анализа"); ?>
</td></tr>
<tr><td>
<?
                 lbutton("/menu/href/world.php","Шкала событий");
?>
</table>

Но все равно, кнопку необходимо вначале нарисовать, а затем перегрузить на сервер. Конечно, при должном навыке это требует не слишком много времени, но тем не менее...

Между тем при разработке прототипа системы, а также при проектировании пользовательского интерфейса рисовать кнопки особого смысла нет, ведь какие-то придется переделывать, какие-то — просто убирать. Так что имеет смысл воспользоваться средствами GD, которые позволяют нам быстро сгенерировать картинку с текстом (то есть нарисовать кнопку).

Вы обратили внимание в приведенном выше фрагменте на вызов функции 1but ton. Это вызов функции «легковесной» кнопки, которая генерирует картинку с заданным текстом. Ее определение, которое не претендует на универсальность, но достаточно удобно при практической работе, приведено в листинге 17.12.

Листинг 17.12. Функция Ibutton генерирует картинку с заданным текстом function Ibutton($href,$txt="текст",$alt="")
{
       // Преобразуем текст строки в Windows-кодировку, чтобы
       // сформировать строку в правильном формате
       if (strstr($HTTP_USER_AGENT,"MSIE")) // тьфу-тьфу
          { $txt = convert_cyr_string($txt,"k","w");         }
       $txt = urlencode($txt); // чтобы работали пробелы и русский
       echo "<a href=\"$href \"><img src=\"/button . php?text=$txt\" border=0\n";
       if ($alt) {
          echo " alt =\"$alt\"\n";
             }
       echo " style= ' cursor:hand'></a>\n";
}

Обратите внимание на необходимость конвертировать исходный текст кнопки в ко- дировку Windows-1251. Это связано с тем, что данные передаются с помощью метода GET, подверженного преобразованиям Apache в соответствии с кодировкой навига- тора. Теперь осталось взглянуть только на код программы button.php (листинг 17.13).

Листинг 17.13. Программа button.php <?php

header("Content-type: image/png");

if (! isset($text)) { $text = "Текст кнопки";}
if (!isset($w)) { $w = 120;} // ширина кнопки
if (Msset($h)) { $h'= 35;} // высота

$im = ImageCreate($w,$h);

$fon = ImageColorAllocate($im,0,0,97) ;
// фон темно-синий
$bukva = ImageColorAllocate($im,240,240,35) ; // цвет буквазоида
ImageFiliedRectangle($im,
0,0,$w-l,$h-l, $fon); // заливаем фоном

// Теперь остается определить точку вывода
// текста и ввести его в кнопку

ImageString($im,5,5,10,$text,$bukva);

// В завершение выводим полученную картинку
imagePNG(Sim);
?>

Рис. 17.10. Автоматически сгенерированная кнопочка

Результат вызова этой функции без дополнительных аргументов приведен на рис. 17.9. Конечно, никто не мешает вам развивать идею кнопок, добавлять дополнительные аргументы, определяющие ее цвета и размеры, подгружать TTF- шрифты и т. д, но это уже совсем другая история.

назад
далее

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