Функции рисования - библиотека GD

В статье "Основы компьютерной графики" я ранее освещал аспекты графики и ее использования в php. А также уже упоминал о том как сделать Thumbnail на php. Сегодня будет более подробный обзор именно по функциям бибилотеки GD для php - рассмотрим создание изображения, работу с цветом, рисование простейших геометрических фигур, ну и собственно вывод в браузер результата работы.

Помню со школьного курса по бейсику что графика это такая очень громоздкая штука в плане объема кода, мы там рисовали что-то вроде ракеты. В библиотеке GD для php все много проще - хотя литературы по ее использованию на просторах рунета не сказать чобы уж очень много. Видимо здесь играет свою роль так называема "проблема перевода" - если официальная документация по php в основном переведа на русский, то со справкой по библиотеке GD дело обстоит не так радужно. Буду излагать материал как можно подробнее, но если остаются вопросы-задавайте их в комментариях, постарюсь оперативно ответить.

Итак, начнём. В обобщенном виде алгоритм работы с графической библиотекой GD для php выглядит следующим образом:

  1. Создание холста для изображения - по своей сути выделение памяти для создаваемого рисунка
  2. Рисование изображения, добавление цветов в палитру, текста и графической информации
  3. Отображение полученного изображения в окне браузера, либо сохранение его на диске
  4. Очистка памяти

Изображение может быть создано с помощью функции imagecreate (int x_size, int y_size) в случае с 256 цветным изображением, либо с помощью imagecreatetruecolor(), которая создает полноцветное изображение (16,7 миллиона цветов). Обе функции возвращают указатель на вновь созданное изображение - по аналогии с обращением к файлам можно сказать что указатель - аналог дескриптора. В нашем примере мы будем использовать следующую конструкцию: $myImage = imagecreate(400, 300); //создать пустой холст размером 400*300 пикселей и максимальным числом цветов = 256.

Далее нужно определиться с фоновым цветом для вновь созданного изображения, для этого в библиотеке GD применяется функция int imagecolorallocate (resource image, int red, int green, int blue), которая принимает 4 параметра - указатель на изображение, и значения цветов в модели RGB (о ней подробно можно почитать здесь). В результате функция возвращает идентификатор цвета, добавленного в палитре созданного изображения, либо -1 в случае если цвет добавить не удалось. Первый вызов функции imagecolorallocate() для вновь созданного изображения присвоит фоновый цвет холсту, в случае если изображение создано с помощью imagecreatetrucolor() цвет фона автоматически создается черным, в дальнейшем его можно переопределить. Есть похожая функция imagecolorresolve(), которая в случае если палитра уже заполнена и новый цвет добавить невозможно вернет указатель на уже существующий в палитре аналог , либо на наиболее близкий к добавляемому цвет. В примерах у меня используется следующий код:

  • $myGreen = imagecolorallocate($myImage, 51, 153, 51); //Фоновый цвет
  • $myBlack = imagecolorallocate($myImage, 0, 0, 0); //Черный цвет
  • $myWhite = imagecolorallocate($myImage, 255, 255, 255); //Белый цвет
  • $myRed = imagecolorallocate($myImage, 255, 0, 0); //Красный цвет
  • $myBlue = imagecolorallocate($myImage, 0, 0, 255); //Синий цвет

Когда все необходимые цвета добавлены в палитру можно приступать к рисованию (хотя цвета можно добавлять и в процессе - здесь я их вынес вверх просто для облегчения понимания). Самое просто что можно нарисовать - это точка, или пиксель. Для этого в библиотеке GD для php применяется функция int imagesetpixel (resource image, int x, int y, int color). Параметры у нее следующие: (указатель на изображение, координата x, координата y, указатель на цвет в палитре). Описываем все это таким кодом: imagesetpixel($myImage, 100, 30, $myBlack); //Черный пиксель.

Следующей задачей будет нарисовать прямую - как мы помним из геометрии для того чтобы нарисовать отрезок - нужно знать его начало и конец. Здесь то же самое int imageline (resource image, int x1, int y1, int x2, int y2, int color). Функция принимает уже привычные параметры - указатель и цвет, ну а нового в сравнении с пикселем то, что вместо координаты одной точки указываются 2 пары координат - начальной и конечной точки. В нашем примере это imageline($myImage, 15, 25, 385, 295, $myWhite); //Прямая белая линия.

Рисование прямоугольников. Прямоугольник задаётся таким же набором координат как и прямая - но это уже не его начало и конец, а 2 противоположные вершины. Используемая функция: int imagerectangle (resource image, int x1, int y1, int x2, int y2, int col). В нашем примере прямоугольник определен следующим образом: imagerectangle($myImage,200,10,350,60,$myRed); //Прямоугольник.

Рассмотрим рисование окружностей и эллипсов. Собственно разницы между ними с точки зрения используемых функций нет, в обоих случаях это imageellipse(resource image, int x, int y, int width, int height, int col);. Параметры функции следующие: (указатель на изображение, координата центра x, координата центра y, диаметр по горизонтали, цвет в палитре). Собственно вся разница между окружностью и эллипсом скрыта в разности диаметров по горизонтали и вертикали для эллипса. В нашем примере используется следующий код:

  • imageellipse($myImage, 340, 160, 100, 150, $myBlack); //Эллипс
  • imageellipse($myImage, 240, 120, 100, 100, $myBlue); //Окружность

Рисование дуг. Дуга это часть окружности или эллипса, за исключением некоторой части, в которой и кроется отличие. Для того чтобы описать дугу используется функция imagearc(resource image, int x, int y, int width, int height, int start_degree, int end_degree, int col). Параметры ее схожи с предидущей функцией, за исключением int start_degree, int end_degree которые описываю начальную и конечную точку в угловых координатах. За 0 принимается положение "3 часа" и далее отсчет ведется против часовой стрелки: 6 часов=90 градусам, 9 часов=180 и так далее в диапазоне от 0 до 360. Пример дуги - imagearc($myImage,70,150,100,70,330,270,$myBlue); //дуга.

Задание многоугольников. Многоугольник представляет собой фигуру, имеющую 3 и более углов. Для отрисовки его в библиотеке GD предусмотрена функция int imagepolygon (resource image, array points, int num_points, int color). Кроме уже известных нам параметров в функцию необходимо передать массив вершин array points в формате (X1,Y1,...,Xn,Yn) и числовой параметр int num_points который собственно говорит сколько вершин будет у многоугольника - почему нельзя было это количество взять из массива для меня осталось загадкой, ну да в общем случай не смертельный, пусть будет так. Пример многоугольника:

  • $myPoints = array(20,220,185,255,70,280,380,295,170,150); //массив вершин многоугольника
  • imagepolygon($myImage,$myPoints,5,$myRed); //сам многоугольник

Вот мы и рассмотрели все основные фигуры и методы их отрисовки с помощью библиотеки GD для php. Что мы получаем в результате:

Рисование - бибилиотека GD для php

Чтобы избавить Вас от необходимости набивать код - привожу листинг примера

$myImage = imagecreate(400, 300); //создать пустой холст
$myGreen = imagecolorallocate($myImage, 51, 153, 51); //Фоновый цвет
$myBlack = imagecolorallocate($myImage, 0, 0, 0); //Черный цвет
imagesetpixel($myImage, 100, 30, $myBlack); //Черный пиксель
$myWhite = imagecolorallocate($myImage, 255, 255, 255); //Белый цвет
imageline($myImage, 15, 25, 385, 295, $myWhite); //Прямая белая линия
$myRed = imagecolorallocate($myImage, 255, 0, 0); //Красный цвет
imagerectangle($myImage,200,10,350,60,$myRed); //Прямоугольник
imageellipse($myImage, 340, 160, 100, 150, $myBlack); //Эллипс
$myBlue = imagecolorallocate($myImage, 0, 0, 255); //Синий цвет
imageellipse($myImage, 240, 120, 100, 100, $myBlue); //Окружность
imagearc($myImage,70,150,100,70,330,270,$myBlue); //дуга
$myPoints = array(20,220,185,255,70,280,380,295,170,150); //массив вершин многоугольника
imagepolygon($myImage,$myPoints,5,$myRed); //сам многоугольник
header("Content-type: image/png");
imagepng($myImage);
imagedestroy($myImage);

Последние 3 строки  листинга, не описанные выше, соответсвуют пунктам 3 и 4 нашего алгоритма - посылка заголовка, вывод изображения в браузер и очистка памяти.

Вот собственно и все, что хотел описать в рамках данного топика об использовании библиотеки GD в php, до встречи на страницах блога!