Создание графического изображения средствами PHP

РНР не ограничивается созданием только HTML документов. Можно создавать различные виды медиа-контента, в том числе и файлы изображений.

Для этого необходимо установить библиотеку GD, которая позволяет работать с различными форматами изображений, такими как GIF, PNG, JPEG, WBMP, и XPM.

Вывод PHP потока возможен непосредственно в браузер. Для этого нужно собрать PHP с библиотекой GD функций, для работы с изображениями. GD и PHP могут также потребовать другие библиотеки, в зависимости от форматов с которыми нужно работать.

Поддержка этой библиотеки включается при компиляции PHP с опцией --with-gd.

По умолчанию PHP формирует HTML-страницу с заголовком Content-type: text/html. Однако, возможно формирование средствами PHP различного вида медиа-контента. Для формирования заголовков создаваемого контента в PHP используется функция header().

<?php
header("Content-type: text/html");        // выводим документ в формате HTML
header("Content-type: text/plain");       // выводим обычный текстовый файл
header("Content-type: image/jpeg");       // выводим изображение в формате JPEG
header("Content-type: image/png");       // выводим изображение в формате PNG
header("Content-type: image/gif");       // выводим изображение в формате GIF
header("Content-type: application/zip");  // выводим ZIP файл
?>

Конечно, отправка одного заголовка для формирования изображения недостаточно, необходимо позаботиться о том, чтобы вывести данные в нужном формате. Библиотека GD предоставляет набор функций с помощью которых можно строить изображения на основе графических примитивов, а также обрабатывать уже существующие. Полную документацию по библиотеке GD можно посмотреть здесь. На лекции рассмотрим несколько ключевых функций, необходимых для построения несложных изображений и понимания принципов работы библиотеки:

Пример синтаксиса

Версия

Описание

$im =
ImageCreate ($width, $height)

Любая

Создает пустой холст (256 цветов) $im высотой
$height и шириной $width. (формат PNG предпочтителен)

$col =
ImageColorAllocate ($im, $red, $green, $blue)

Любая

Помещает в переменную $col цвет, образованный
составляющими красного, зеленого и синего оттенка $red, $green, $blue (диапазон 0 ..
255).

ImageEllipse
($im, $x, $y, $l, $h, $col)

2.0.2

Создает эллипс на изображении $im с центром в
точке ($x,$y), шириной $l, высотой $h и цветом $col.

ImageFilledEllipse
($im, $x, $y, $l, $h, $col)

2.0.2

Идентична ImageEllipse, но эллипс заполняется
цветом $col

ImageFill
($im, $x, $y, $col)

Любая

Производит заливку, начиная с заданных координат (верхний левый угол имеет координаты 0, 0), цветом $col в изображении $im.

ImageLine
($im, $x1, $y1, $x2, $y2, $col)

Любая

Рисует линию цвета $col, которая проходит
между двумя точками с координатами ($x1,$y1) и ($x2,$y2)

ImagePolygon
($im, $points, $num_points, $col)

Любая

На изображении $im рисует многоугольник,
координаты которого перечислены в массиве $points ($points[0]=$x0,
$points[1]=$y0, $points[2]=$x1, $points[3]=$y1, и т. д.),
$num_points – количество точек в массиве, $col - цвет.

ImageFilledPolygon
($im, $points, $num_points, $col)

Любая

Идентична ImagePolygon, но многоугольник заполняется
цветом $col

ImageRectangle
($im, $x1, $y1, $x2, $y2, $col)

Любая

На изображении $im рисует прямоугольник,
верхний левый угол которого имеет координаты ($x0, $y0) , а правый
нижний ($x1, $y1). $col – цвет прямоугольника.

ImageFilledRectangle
($im, $x1, $y1, $x2, $y2, $col)

Любая

Идентична ImageRectangle, но прямоугольник
заполняется цветом $col

ImageSetStyle
($im, $style)
ImageSetBrush ($im, $brush)

2.0.2

Эти функции позволяют изменить стиль
прочерчиваемых линий. Для более подробной информации посмотрите
официальную документацию, особенно обратите внимание на пример
использования функции ImageSetStyle , который также является
показательным для функции ImageSetBrush

ImageSetPixel
($im, $x, $y, $col)

Любая

В изображении $im рисует точку с координатами
($x,$y) и цветом $col

ImageString
($im, $font, $x, $y, $text, $col)

Любая

В изображении $im создает строку $text с
координатами (левый верхний угол) ($x,$y) цвета $col $font -
размер (гарнитура) шрифта (от 0 до 5)

ImageStringUp
($im, $font, $x, $y, $text, $col)

Любая

Идентична ImageString , но строка выводится
вертикально

Начнем с простого: нарисуем с помощью PHP красный квадрат на синем фоне. Чтобы получить желаемый квадрат, необходимо выполнить следующие действия:
• Установить тип содержимого как «изображение», чтобы браузер смог интерпретировать изображение должным образом;
• Создать новое пустое изображение, установив нужную ширину и высоту;
• Сделать цвет фона синим;
• Получить новый цвет - красный;
• Отрисовать квадрат красным цветом;
• Сохранить окончательный вариант изображения и передать его в браузер;
• Очистить память, которая использовалась для создания и хранения изображения;
• Организовать отображение рисунка из файла index.php

Теперь, когда мы определились с порядком действий, можно начинать кодирование. Итак, вот код для создания красного квадрата. После написания сохраним его под именем ‘basic_square.php’.

<?php
  //Устанавливаем тип содержимого 
  header('content-type: image/png');
 
  //Определяем размеры изображения 
  //125px width, 125px height
  $image = imagecreate(125, 125);
 
  //Выбираем цвет фона
  $blue = imagecolorallocate($image, 0, 0, 255);
 
  //Устанавливаем еще один цвет – красный для построения квадрата
  //Обратите внимание – цвет созданный первым, будет цветом фона.
  $red = imagecolorallocate($image, 255, 0, 0);
 
  //Строим закрашенный квадрат красным цветом
  ImageFilledRectangle($image, 50, 50, 75, 75, $red);  
 
  //Сохраняем файл в формате png и выводим его 
  imagepng($image);
 
  //Чистим использованную память
  imagedestroy($image);
  ?>

Нарисованный квадрат можно увидеть открыв в браузере ссылку на файл basic_square.php, но лучше будет, если изображение будет выведено на главной странице index.php с помощью тега :

<img src='/basic_square.php' alt='красный квадрат' />

Результат:
Красный квадрат на PHP

Используя графические примитивы можно строить и более сложные узнаваемые изображения:

Чебурашка на PHP

<?php
header("Content-Type:image/jpeg");
$img = imageCreateTrueColor(600,500);
imagefilledrectangle($img,0,0,600,500,imagecolorallocate($img,255,255,255));
 
$black = imagecolorallocate($img,0,0,0);
 
//Тело
imagearc($img, 322, 311, 178, 178,  154, 195, $black);
imagearc($img, 271, 312, 180, 180,  344, 26, $black);
imagearc($img, 218, 352, 371, 371, 318, 0, $black);
imagearc($img, 385, 341, 42, 42, 26, 155, $black);
imagearc($img, 202, 341, 328, 328, 342, 3, $black);
imagearc($img, 363, 345, 347, 347, 178, 224, $black);
imagearc($img, 208, 340, 42, 42, 28, 153, $black);
imagearc($img, 388, 343, 324, 324, 178, 200, $black);
 
imagepolygon($img, array(
			189, 350,
			188, 369,
			194, 364,
			199, 368,
			202, 361), 5, $black);
imagepolygon($img, array(
			404, 350,
			410, 366,
			402, 362,
			400, 368,
			394, 360), 5, $black);
imagearc($img, 343, 256, 164, 164,  157, 197, $black);
imagearc($img, 298, 262, 80, 80, 44, 140, $black);
imagearc($img, 238, 262, 188, 188, 343, 17, $black);
 
 
//Правая нога
imagearc($img, 190, 495, 308, 308,  290, 314, $black);
imagearc($img, 350, 368, 112, 112,  142, 165, $black);
imagearc($img, 350, 320, 188, 188,  100, 119, $black);
imageline($img, 335, 413, 369, 413, $black);
imagearc($img, 366, 385, 56, 56, 41, 85, $black);
imagearc($img, 371, 389, 44, 44, 353, 41, $black);
imagearc($img, 326, 420, 150, 150, 291, 333, $black);
 
 
//Левая нога
imagearc($img, 394, 487, 286, 286,  227, 254, $black);
imagearc($img, 270, 382, 52, 52, 3, 53, $black);
imagearc($img, 258, 370, 86, 86, 51, 93, $black);
imageline($img, 257, 413, 222, 413, $black);
imagearc($img, 223, 388, 50, 50, 94, 143, $black);
imagearc($img, 227, 387, 56, 56, 146, 183, $black);
imagearc($img, 270, 428, 166, 166, 211, 251, $black);
 
//Лицо
imagearc($img, 249, 133, 48, 48, 0, 360, $black);
imagearc($img, 251, 128, 38, 38, 0, 360, $black);
imagearc($img, 258, 119, 10, 10, 0, 360, $black);
imagearc($img, 352, 133, 49, 49, 0, 360, $black);
imagearc($img, 354, 126, 36, 36, 0, 360, $black);
imagearc($img, 360, 117, 10, 10, 0, 360, $black);
imageellipse($img, 240, 92, 30, 14, $black);
imageellipse($img, 358, 90, 28, 14, $black);
imagearc($img, 301, 178, 28, 28, 41, 140, $black);
imagepolygon($img, array(
			301, 143,
			314, 167,
			301, 159,
			287, 167), 4, $black);
imageellipse($img, 301, 143, 204, 170, $black);
imageellipse($img, 301, 143, 260, 188, $black);
imagearc($img, 475, 144, 180, 180, 220, 142, $black);
imagearc($img, 123, 144, 187, 187, 37, 322, $black);
imagearc($img, 133, 146, 135, 135, 38, 319, $black);
imagearc($img, 463, 146, 126, 126, 225, 140, $black);
 
//Заливка цветом
imagefilltoborder($img, 249, 136, $black, $black);
imagefilltoborder($img, 364, 136, $black, $black);
imagefilltoborder($img, 404, 358, $black, $black);
imagefilltoborder($img, 191, 360, $black, $black);
imagefilltoborder($img, 123, 128, $black, imagecolorallocate($img, 105, 36, 21));
imagefilltoborder($img, 463, 128, $black, imagecolorallocate($img, 105, 36, 21));
imagefilltoborder($img, 350, 370, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 250, 370, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 358, 90, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 240, 92, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 48, 128, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 543, 128, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 232, 213, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 301, 155, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 270, 320, $black, imagecolorallocate($img, 138, 65, 50));
imagefilltoborder($img, 300, 200, $black, imagecolorallocate($img, 255, 208, 100));
imagefilltoborder($img, 290, 262, $black, imagecolorallocate($img, 255, 208, 100));
 
imagejpeg($img,NULL,100);
?>