Динамическое создание изображений средствами PHPИсточник: php Nykoh (Нико)
Динамическое создание изображений средствами PHPВ статье описывается работа с расширением PHP - GDLib, которое позволяет динамически формировать изображения на Web-страницах. Для понимания этой статьи необходимо иметь представление об элементарных основах PHP, а также работе с изображениями.
Примечание переводчика
в примерах все названия идентификаторов даны на французском языке. Для того, чтобы облегчить читателю понимание кода, мы предлагаем их перевод:
Примечание переводчика
По умолчанию в PHP 5 все расширения отключены, в том числе и расширение для формирования динамических изображений - GD. Поэтому Вам необходимо включить расширение GD в файле конфигурации php.ini.
Цели: научить использовать различные функции библиотеки gd, предназначенные для динамического создания изображений.
Библиотека GD представляет собой набор функций для работы с изображениями. Благодаря ей можно не только динамически создавать собственные изображения, но и получать о них различную информацию, изменять размер и т.д.
Внимание: Прежде чем начать работу, нужно кое-что узнать. Дело в том, что существует несколько различных версий этого расширения PHP, а поставщики услуг хостинга могут отключить определенные функции, а то и всю библиотеку GD. С какой целью? Известно, что обработка изображений - это большая нагрузка на сервер.
Итак, вам необходимо узнать версию библиотеки GD установленную на используемом вами хостинге, а также получить информацию о разрешенных функциях. Первое, что следует сделать, - воспользоваться функцией phpinfo. Выполните следующий скрипт:
phpinfo.php
Если у вас появится таблица похожая на эту - все нормально (особенно если версия библиотеки новее, чем 2.0)
GD
Как было упомянуто выше, некоторые возможности могут быть отключены. В таком случае следует просто попробовать использовать ту или иную функцию. Если это приведет к ошибке: Fatal error: Call to undefined function, - у вас не должно быть никаких сомнений, что данная функция отключена.
I) Создание холста
Для начала необходимо создать пустой холст. Сразу поясним, что в данной статье мы будем рассказывать исключительно об изображениях в формате PNG или JPG, формат GIF останется без нашего внимания. Дело в том, что этот формат перестал поддерживаться библиотекой GD, начиная с версии 1.3, правда ограниченная поддержка GIF появилась опять в версии 2. Вывод: формат PNG - выгодная альтернатива GIF
Важное замечание
Во всех учебных курсах сайта www.phpdebutant.org, скрипты имели целью динамическое создание html-страниц. На этот раз, используя библиотеку GD, мы создаем изображения, поэтому в данном случае вы должны забыть на время конструкции echo и print. По умолчанию PHP-скрипт генерирует html-страницу, что не требует уточнения в виде отправки особого http-заголовака. Но если мы создаем изображение, в самом начале скрипта необходимо указать его тип, отправкой соответствующего заголовка, например для PNG: header ("Content-type: image/png");
Дальнейшие действия чем-то напоминают работу с графическим редактором. Вы создаете новое изображение, указывая размеры, выбираете цвет фона и сохраняете его в нужном формате. Данную последовательность действий иллюстрирует следующий скрипт:
imagevide.php
Этот небольшой скрипт генерирует красный прямоугольник (очень скромное, но хорошее начало). Описание механизма:
Ее параметры соответствуют красной, зеленой и синей компонентам цвета и представляют из себя целые числа от 0 до 255. В этом примере мы создали красный цвет.
Важное замечание
этот цвет соответствует цвету фона, поскольку он первым добавляется в палитру изображения
Вызов скрипта imagevide.php (пустое_изображение.php) создаст изображение в формате PNG. Для того, чтобы его использовать на web-сайте, нужно действовать так же, как и в случае с "классическими" изображениями.
Совсем несложно! Вы даже можете передавать параметры скрипту, который будет генерировать изображение (например цвет фона).
Итак, вы уже обладаете некоторыми базовыми знаниями для того, чтобы начать рисовать. Если вам хочется их углубить - вот несколько интересных функций
II) Функции прорисовки изображения
Сначала вам необходимо знать, что любой рисунок связан с понятием координат, поэтому в этом небольшом абзаце статьи мы дадим некоторые представления об этом вопросе.
Например, для изображения с разрешением 100 на 200 пикселей координаты будут такими:
Различные функции прорисовки изображения принимают в качестве параметров его координаты. Приучайтесь передавать их в требуемом порядке. Так, например, для того, чтобы нарисовать прямоугольник, необходимо передать координаты двух точек соответствующей функции (ImageRectangle). Координаты первой точки соответствуют верхнему левому углу изображения, координаты второй точки соответствуют нижнему правому углу. Не путайте аргументы, поскольку некоторые функции могут выдать ошибочные результаты.
Вот список функций, которые необходимы для прорисовки различных форм, а также для размещение текста на создаваемом изображении.
III) Пример первый: статистика посещений сайта в виде графика
Чтобы применить полученные знания на практике - создадим простой скрипт-пример. Часто требуется представить статистику посещения сайта в форме гистограммы
Мы предполагаем, что вы уже разработали ту часть скрипта, которая отвечает за учет посетителей (возможно с использованием таблицы MySQL). Об ее реализации мы говорить здесь не будем, это не цель данной статьи. Допустим, что статистика посещений за каждый месяц помещена в массив $visites. В этой статье мы наполняем массив "вручную", но вы можете сделать это сами, используя данные вашей таблицы MySQL.
a) Статистика посещений: создание изображения и цвета
Начнем с создания массива, который содержит в себе статистику посещений сайта за 12 месяцев (12 элементов). Затем сгенерируем картинку разрешением 400х300 и создадим три цвета, один из которых (белый) будет цветом фона.
visites.php
header ("Content-type: image/png");
b) Рисуем оси графика
Поместим горизонтальную ось времени (простая черная линия) в нижнюю часть изображения, оставив поле в 10 пикселов.
Внизу подписываем номер каждого из 12 месяцев, используя цикл for и функцию ImageString. Номера месяцев располагаются через каждые 30 пикселов, начиная с левой стороны изображения.
Наконец, проводим вертикальную линию, ось ординат статистики посещений.
<?php // проводим вертикальную линию, чтобы ось ординат (число посещений)
c) Рисуем палочки
Теперь переходим к более сложной задаче - рисованию палочек.
Для начала нам необходимо узнать максимальное число посетителей, которое мы представим на графике. Здесь мы выбрали случайное значение - 1000, но на самом деле вам, наверное, придется его вычислять, осуществляя запрос на максимальное значение столбца вашей таблицы MySQL. Мы же сделаем проще…
Для каждого месяца необходимо вычислить высоту создаваемого прямоугольника. Для этого необходимо решить уравнение, зная что высота прямоугольника (палочки) для максимального количества посещений будет равна высоте всего изображения. Исходя из количества посещений за определенный месяц мы получаем искомую высоту
Нам остается только прорисовать каждый прямоугольник, начиная с координат его верхнего левого угла и кончая нижним правым.
Добавим количество посещений за месяц над каждым прямоугольником для улучшения гистограммы.
d) А вот и результат!
Результат, конечно, не назовешь превосходным, но следует учитывать, что нам удалось сделать что-то более или менее презентабельное, написав всего 20 строчек простого кода, что само по себе уже неплохо.
Гистограмма посещаемости по 12 месяцам.
IV) Другие полезные функции
Вот еще один набор полезных функций, предназначенных для управления цветовой палитрой, а также для получения различной информации об изображениях.
V) Пример второй: генерация миниатюр (уменьшенных копий изображения)
Этот пример имеет целью создание уменьшенной копии существующего изображения. Возможно, вам придется реализовывать эту функцию при написании фотогалереи на РНР, в которой фотографии представлены в форме миниатюр, а посетитель может щелкнуть на них мышью, чтобы увеличить. В данном примере мы сгенерируем миниатюру, снабженную рамкой и некоторыми пояснениями (размер и имя изображения)
a) Начало
В отличие от первого примера, данный скрипт будет записывать изображение в файл, а не генерировать его на лету. Поэтому необходимость в отправке особого http-заголовка при помощи функции header() отпадает. Таким образом, скрипт становится "классическим" и может генерировать html.
Начнем с создания пустого холста размером 200х150, затем считаем существующее изображение (из файла) при помощи функции ImageCreateFromJpeg. Потом нам также могут понадобится размеры изображения-источника, для этого мы воспользуемся imagesx и imagesy.
miniature.php
$source = ImageCreateFromJpeg($fichierSource);
b) Рамка
Предварительно создав несколько цветов, рисуем рамку. Чтобы упростить задачу, мы будем использовать различные оттенки серого.
Существует простой способ создания подобной рамки, который заключается в прорисовке нескольких разноцветных прямоугольников, вложенных один в другой. Начинаем с самого большого прямоугольника темного цвета (его размер совпадает с размерами изображения). Затем на него накладываем другой меньший по размерам прямоугольник, цвет которого будет более светлым и т.д.
Толщина создаваемой нами рамки - 8 пикселов.
for ($i=0; $i<=7; $i++) {
c) Создание миниатюры
Для создания миниатюры используется функция ImageCopyResampled. Она копирует одно изображения на другое, при этом может изменять размер копируемой области. Данная функция принимает несколько параметров, значение которых очевидно. Перечислим их по порядку:
Создав миниатюру, добавим небольшой текст с информацией на нее.
Внимание
Функция ImageCopyResampled - создает большую нагрузку на сервер, не злоупотребляйте ей!
d) Сохранение результата.
Нам остается только сохранить полученный результат в файле, имя которого начинается с mini_. Это мы сделаем при помощи функции ImageJpeg.
Вот результат "mini_photo3.jpg":
mini_photo3.jpg
VI) FAQ и заключение
Библиотека GD предоставляет широкие возможности для работы с изображениями, но они порой слишком загружают сервер (это справедливо для большинства хостингов)
Вот небольшой набор вопросов и ответов по часто встречающимся проблемам
Мое изображение не выводится, браузер ведет себя так, как будто изображение не существует.
Скрипт долго выполняется на моем хостинге, это нормально?
Цвета моего изображения искажены (или оно выводится как черно-белое), почему?
Заканчивая данную статью, покажем результат, который можно получить, скомбинировав два примера этой статьи. Тут к гистограмме мы добавили полутона, используя тот же метод, что и в примере 2.
Результат в виде гистограммы на фоне изображения. |