Работа с графикой faq по php


Содержание

PHP — работа с графикой

Правильная картинка

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

Установка

Для того что бы начать, прежде всего нужно убедиться что ваша версия PHP не ниже 5.1.3, так как этот экстеншин не будет работать на более ранних версиях. Если все впорядке, то нужно загрузить и скомпилировать библиотеки (ниже пример как это можно сделать на *NIX системе):

Как только это сделано, нужно установить GraphicsMagic используя PECL команду:

В случае если у вас нет доступа к PECL, тогда вы также можете загрузить исходники и cкомпилировать их в загружаемый PHP модуль с phpize:

Независимо от того какой способ вы выбрали, у вас должен получиться модуль gmagick.so в папке расширений php. После этого включите расширение в php.ini файл, перезапустите сервер, и предполагается что вы увидете следующее phpinfo():

Создаем изображения

Теперь, когда есть все что нам нужно, давайте же наконец то посмотрим что мы можем сделать. Ниже простой пример, который читает картинку и выводит ее различные свойства:

Так скажем, основной точной входа в GraphicsMagic из PHP является объект Gmagic, который инициализируется в первой строке примера. Этот объект предоставляет несколько методов для работы с картинками, но давайте начнем с метода readImage(), который принимает путь к картинке как аргумент и считывает картинку в память. Детальная информация о картинке, такая как ее размер, разрешение, глубина цвета и формат, может быть получена через набор соответсвующим образом названных методов (get*() методы), как проиллюстрировано выше.

Вывод на странице будет выглядить следующим образом:

Маштабирование

Если вам необходимо динамические маштабировать картинку наше расширение об этом позаботится: вызовите метод resizeImage() с новой высотой и шириной.

Как это делается, рассмотрим в следующем примере, где каринка увеличивается в 1,5 раза:

Так будет выглядить вывод:

Вы можете изменить пропорции картинки с помощью resampleImage(), который получает размеры картинки, фильтры и кооф. размытия как аргументы. Выглядит это следующим образом

Вывод в браузер:

Если же вам нужно создать привью для галереи, то GraphicsMagick предоставляет простой способ: расширение имеет метод thumbnailImage(), который принимает высоту и ширину оригинальной картинки и создает соответсвующие привью. Ниже расположен пример, который перебирает файлы в каталоге, находит JPGи, и уменьшает их до размеров 150X150 пикселей:

Как этот пример выглядит в браузере:

Режь это

GraphicsMagick предоставляет, также, методы для вращения, переворачивания и обрезания картинок:

Метод rotateImage() требует 2 аргумента: угол вращения и цвет, которым будет заполнено пустое пространство, образованное вращением картинки.

Вы можете создать вертикальное или горизонтальное отражение с помощью методов flipImage() и flopImage():

Результат работы скрипта:

Вы можете вырезать кусок картинки с помощью cropImage(), который принимает 4 аргумента: ширина, высота куска который нужно вырезать, в пикселях, и координаты X и Y от верхнего левого угла куска который должен быть вырезан. Пример:

И наконец, вы можете увеличить вдвое от оригинального размера, или уменьшить его вдвое с помощью magnifyImage() и minifyImage, как показано ниже:

Не мой тип

Будучи поистине универсальным инструментов для работы с картинками GraphicsMagick может работать со множеством форматов, среди которых JPEG, GIF, PNG и TIFF и позволяет конверить эти форматы, что называется, на лету. Для этого просто прочтите файл с помощью readImage(), используйте setImageFormat() что бы установить желаемый формат и потом используйте writeImage(). Все очень просто:

Here’s an example:

Узнать какие форматы могут быть сконвертированы, можно с помощью queryFormats().

В рамке

Вы можете добавить двумерные рамки к вашим картинкам, используя borderImage(), который получает 3 аргумента: цвет рамки, толщину рамки и высоту рамки:

А так это выглядит в броузере:

Если же вы предпочитаете 3D-рамки, то frameImage() позволит вам добавить глубину

Вы можете размыть картинку ( blurImage() ) или сделать ее более резкой — sharpenImage(). Оба эти метода принимают радиус размывки или резкости и стандартные искажения:

В заключение

И напоследок одна из самых впечатляющих возможностей. В GraphicsMagick существует куча методов, которые позволяют применять специальные эффекты для картинок. К примеру, swirlImage(), который делает вашу картинку похоже на смываемой в унитаз:

Метод charcoalImage() позволяет рендерить вашу картинку в стиле рисунка углем:

Метод oilPaintImage() применит эффект живописи маслом:

cycleColorMapImage() позволяет изменять цвета. Картинку можно довести до настоящего безумия, применяя этот эффект несколько раз:

solarizeImage() применит эффект темной комнаты к вашей картинке:

shearImage() позволит переместить часть картинки, собрав эффект «параллограмма»:

Эта статья является вводной и описывает только верхушку айсберга: в GraphicsMagic описано более 130 методов. Другими словами экспериментируйте, возможностей для работы с графикой предостаточно! Надеюсь что данная статья поможет в освоении данного расширения и, вы сможете сами сделать выводы о применения его для своих экспериментов или же в повседневной работе!

Ссылки по теме

Популярные статьи
Информационная безопасность Microsoft Офисное ПО Антивирусное ПО и защита от спама Eset Software


Бестселлеры
Курсы обучения «Atlassian JIRA — система управления проектами и задачами на предприятии»
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год. Электронный ключ
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2020. Все языки. Электронный ключ
Курс «Oracle. Программирование на SQL и PL/SQL»
Курс «Основы TOGAF® 9»
Microsoft Windows Professional 10 Sngl OLP 1 License No Level Legalization GetGenuine wCOA (FQC-09481)
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Windows Server 2020 Standard
Курс «Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации»
Антивирус ESET NOD32 Antivirus Business Edition
Corel CorelDRAW Home & Student Suite X8

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

Работа с графикой / faq по php

Всякому web-программисту приходится работать с изображениями – чисто текстовых сайтов в интернете немного. Самый простой способ поместить на страницу картинку – сохранить ее в файле и поставить в HTML-файле соответствующий тэг. Один из недостатков этого способа очевиден: картинки, которые лежат в файле никак не меняются, чтобы пользователь увидел другое изображение, вебмастеру нужно открыть графический редактор, внести измения и сохранить их. В этой статье я расскажу о создании динамических изображений с помощью языка web-программирования PHP.

Для начала – несколько слов для тех, кто не знаком с PHP. Это – язык сценариев, выполняющихся на стороне сервера для создания динамических web-страниц. Программа на PHP, подобно тексту на JavaScript, VBScript или ASP, вставляется в HTML-файл или сохраняется в отдельном файле с соответствующим расширением. Начало и конец программы отмечаются специальными тэгами . Текст вне этих скобок PHP не интерпретирует, он передается web-браузеру «как есть». Синтаксис PHP довольно подробно описан в руководстве, которое входит в комплект поставки (его также можно взять на сайте http://www.php.net).
Принцип работы с изображениями такой: PHP-программа (а точнее PHP-интерпретатор, работающий на стороне сервера) создает картинку «на лету» и передает ее браузеру в нужном графическом формате.
Для того чтобы воспользоваться возможностями PHP по работе с изображениями, необходимо установить в системе библиотеку GD. Если вы работаете с Linux, то эта библиотека уже должна быть установлена. Если нет – ее можно найти по адресу http://www.boutell.com/gd. Если вы работаете с Windows, то лучше всего посетить http://php.weblogs.com/easywindows. Здесь можно скачать библиотеку php_gd, которая позволит вам насладиться всеми прелестями работы с графикой на PHP. Если вы планируете использовать в своих изображениях шрифты TrueType, вам понадобится библиотека FreeType (http://www.freetype.org).
Несколько слов о поддерживаемых библиотекой GD графических форматах. Версии старше 1.6 поддерживают форматы GIF и JPEG. Более новые версии позволяют работать с JPEG и PNG. Начиная с версии 1.6 формат GIF в GD не поддерживается. Это связанно с тем, что всеми правами на алгоритм LZW-компрессии, использующийся в этом формате, обладает компания Unisys.

Первые шаги

Итак, система настроена, все необходимые библиотеки установлены. Для начала создадим какое-нибудь простое изображение:

Сохраните текст в файле с расширением .php и просмотрите его с помощью браузера. Если вы все сделали правильно, то вы увидите то, что показано на рисунке 1.

Рассмотрим код нашего скрипта более подробно. В первой строчке скрипт сообщает браузеру информацию о типе передаваемых данных с помощью HTTP-заголовка. В нашем примере используется предопределенный тип «image/gif», который означает, что далее последует изображение в формате GIF. Передавать браузеру соответствующий заголовок необходимо всегда. Для форматов JPEG и PNG первая строчка выглядела иначе:

Header(“Content-Type: image/jpeg”);
Header(“Content-Type: image/png”);

Обратите внимание, что заголовок “Content-Type” передается для каждой страницы только один раз, поэтому PHP-код для генерации изображения необходимо помещать в отдельный файл. Кстати, размещение динамической графики вместе с HTML-кодом возможно только при использовании механизма SSI (Server Side Includes), о чем мы поговорим чуть позже.
Создание графики в PHP состоит из четыре этапов:

создание дескриптора изображения;

регистрация используемых цветов;

рисование с использованием предопределенных функций;

и финальная стадия – создание изображения и передача его браузеру.

В нашем примере первый этап выглядит так:

$image = ImageCreate(500, 75);

Здесь функция ImageCreate() создает дескриптор изображения и присваивается его переменной $image. Функция вызывается с двумя параметрами – высотой и шириной изображения. По умолчанию изображение заливается черным цветом. Следующий этап – цвета:

$blue = ImagecolorAllocate($image, 0, 0, 255);


Все используемые в изображении цвета необходимо регистрировать. Для этого используется функция ImageColorAllocate(); ее параметры – дескриптор изображения и RGB-кодировка цвета. Каждый цвет ставится в соответствие переменной, в дальнейшем эта переменная передается функциям рисования.
Вряд ли стоит перечислять все функции рисования. Скажу лишь, что их немало: вы можете «заливать» изображения цветом, рисовать различные фигуры, делать рисунок прозрачным и т.д. Рассмотрим некоторые из них на практике, а об остальных вы сможете узнать из документации.
В нашем первом примере мы «заливаем» изображение синим цветом с помощью функции

ImageFill:
ImageFill($image, 1, 1, $blue);

Второй и третий параметр – координаты начала заливки. Начало координат располагается в левом верхнем углу изображения. Таким образом, координаты (500, 75) определяют правый нижний угол изображения из первого примера.
Теперь следует передать готовый рисунок браузеру. Это делает функция ImageGIF(), ее единственный параметр – дескриптор изображения. Для форматов JPEG и PNG применяйте функции ImageJPEG() и ImagePNG() соответственно. Для освобождения памяти, выделенной под рисунок, в конце скрипта надо вызвать функцию ImageDestroy().

Использование текста в рисунках

Рассмотрим еще одну возможность: попробуем что-нибудь написать на рисунке. Я приведу небольшой пример, а потом поясню механизм работы с текстом:

Результат выполнения скрипта показан на рисунке 2.

Собственно выводом текста занимается функция itrings(). Ее параметры – дескриптор изображения, номер шрифта, координаты точки вывода изображения, строка текста и цвет. Можно использовать один из пяти предопределенных шрифтов фиксированного размера. Они нумеруются от 1 (самый маленький) до 5 (самый большой).
В следующем примере начинается самое интересное: изображение создается динамически на основе вводимых пользователем данных. Создадим простой HTML-файл с формой (рисунок 3).

Работа с графикой в PHP.

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

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

Для выполнения поставленных задач напишем функцию. В качестве параметров она будет принимать имя файла с изображением, ширину изображения, высоту изображения. И выполнять функция будет следующие действия масштабирование изображения, проставление знака об авторском праве и вывод изображение на экран.

Для начала подкорректируем размеры нового изображения, чтобы не исказить пропорции в отмасштабированном изображении

$ratio=$w/$h;// отношение длины к ширине в новых размерах

$size_img=getimagesize($filename);// получаем в виде массива размеры изображения

$src_ratio=$size_img[0]/$size_img[1]; // отношение длины к ширине в реальном изображении

// изменяем размеры с целью соблюдения отношение длины к ширине в реальном изображении после масштабирования

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8427 — | 7331 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Создание графиков на PHP с помощью JPGraph

Иногда в рамках интернет проекта возникает потребность в визуализации данных. Представление данных в виде графиков и диаграмм дает возможность наглядно убедиться, например, в увеличении/уменьшении объёмов продаж в текущем году по сравнению с прошлым годом, количества посетителей и пр., вариантов великое множество.

Специально для этих целей, ребята из Asial Corporation, разработали библиотеку JPGraph. Это объектно-ориентированная библиотека для создания графики профессионального качестве при использовании минимум кода, написанная на PHP.

Используя JPGraph, можно создавать графики, диаграммы, captcha картинки и даже географические карты. В бесплатной версии библиотеки доступно большинство возможностей, но имеется также и профессиональная версия, позволяющая разработчику получить доступ к дополнительным функциям JPGraph.

Для работы с JPGraph вам понадобится PHP версии 4.3.1 и выше, а также установленная библиотека GD. Поддерживается как первая, так и вторая версия GD.

Для установки библиотеки вам нужно скачать архив http://jpgraph.net/download/
и распаковать из него директорию src (должна содержать файл jpgraph.php) в свой проект или в директорию, где у вас хранятся общие библиотеки, если вы планируете использовать JPGraph в нескольких проектах на одном сервере.

Разработчики библиотеки настоятельно рекомендуют не располагать библиотеку в директориях доступных извне, и я с ними полностью согласен.

Последнее, что нужно сделать, это убедиться, что GD библиотека подключена и работает. Это можно проверить, заглянув в вывод функции phpinfo().

Итак, библиотека установлена, попробуем создать простенький график.

Данный код при выполнении сгенерирует такое изображение:

Рассмотрим ещё неcколько типов графиков, которые предоставляет JPGraph (здесь я не буду приводить полный код примеров, а только новые строки).

Столбчатая диаграмма

JPGraph также предоставляет возможность генерировать 3D проекции.
Отобразим статистику использования браузеров на 1 сенября 2012 года в виде круговой диаграммы.

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

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

Создание сайта на WordPress

Что как и почему в WordPress

Работа с графикой в PHP

PHP-сценарий для работы с изображением и пример создания изображения с текстом

PHP-сценарий для работы с изображением включает:

1. Создание рисунка (рисунок хранится в растровом формате)

и/или
средствами PHP

2. Указание типа содержимого для браузера (image/png, image/gif или image/jpeg)

3. Вывод готового изображения
Например, передача рисунка в стандартный вывод (в браузер)

4. Освобождение памяти, выделенной для рисунка

Пример создания изображения с текстом поверх существующего png-изображения кнопки

Использование этого сценария на веб-странице:

Работа с графикой / faq по php

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

В этой статье мы рассмотрим работу со второй версией библиотеки GD.

Сборка

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

Для того, чтобы узнать наличие и используемую версию графической библиотеки, воспользуемся всеми нами, без сомнения, любимой функцией phpinfo(), и взглянем на раздел «GD»:

GD Support enabled
GD Version bundled (2.0.15 compatible)
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled
JIS-mapped Japanese Font Support enabled

Если ничего похожего вы не нашли — значит, PHP собран без поддержки графической библиотеки, и придется его пересобирать (или попросить об этом админа).

В противном случае, сначала взглянем на строку «GD Version». Если версия GD — первая (например, 1.6), то часть материала этой статьи вам не подойдет (и, в любом случае, рекомендую обновиться до второй версии). Вторая же версия тоже может быть разная. :) Обратите внимание на слово «bundled». Его присуствие означает, что PHP собран с библиотекой GD, поставляемой вместе с PHP: именно эту библиотеку рекомендуется использовать, так как разработчики PHP исправили множество ошибок и недочетов, присущих оригинальной GD. Впрочем, если используется внешняя библиотека (слово «bundled» в строке «GD Version» отсутствует) — ничего страшного, все приведенные ниже примеры будут работать.

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

Итак, если требуется пересборка PHP, следует это и сделать, загрузив при необходимости последнюю версию PHP, и указать при сборке параметр:

Необязательный параметр location указывает путь к внешней библиотеке GD. Если его опустить (в смысле, не указывать) — используется bundled-версия.

Для поддержки работы с шрифтами TrueType, обсуждаемой в главе «Вывод текста. «, также понадобится наличие библиотеки FreeType и следующие параметры конфигурационной строки:

Примечание: Для сборки GD с поддержкой GIF Write под FreeBSD, необходимо предварительно установить переменную среды WITH_LZW:
export WITH_LZW=yes

Примечание 2:Выше подразумевалось, что используется Unix-подобная ОС. Если же PHP установлен локально, да еще и под Windows — то надо просто раскомментить одну строчку в php.ini — надеюсь, догадаетесь, какую. :)

Генерация изображения с помощью PHP

Ну что ж, со сборкой PHP мы разобрались, и теперь нам не терпится нарисовать и вывести в броузер какую-нибудь картинку с помощью PHP. Надеюсь, вы прекрасно осознаете, что нельзя вот так вот просто взять и вывести картинку посреди HTML-кода в том же самом скрипте (если не осознаете, прочтите внимательно эту статью): в HTML-документе мы разместим, как и обычно, тэг , а в его атрибуте src укажем не картинку, как обычно, а PHP-скрипт:

Теперь приступим к написанию этого самого image.php.

Заголовок. Он же header.


Прежде всего, как броузер узнает, что image.php — это не HTML-документ и не что-то еще, а картинка?

Тип документа броузер определяет по заголовку Content-type. На самом деле, этот заголовок — обязательный и всегда присуствует; по умолчанию, PHP услужливо «отдает» заголовок Content-type: text/html. Обычно это поведение PHP нам прекрасно подходит — но не в данном случае. Придется нам вывести нужный заголовок самим:

Приступим теперь непосредственно к генерации картинки.

Создание изображения

Для создания изображения, в нашем распоряжении две функции:

1. imagecreate(). С помощью этой функции можно создать изображение на основе палитры, содержащей фиксированный набор цветов. Каждый цвет палитры необходимо описать с помощью функцииimagecolorallocate(). Этот способ создания изображения был единственным при работе с первой версией GD, и необходим при работе с ориентированными на палитру форматами, такими как GIF. Однако введенный во второй версии (и отныне рекомендуемый разработчиками) способ, на мой взгляд, гораздо более удобен.

2. imagecreatetruecolor(). Эта функция создает TrueColor-изображение, то есть цвет каждой точки определяется произвольным цветом, задаваемым в координатах RGB. Помимо того, что это удобнее, чем работа с палитрой, такой подход позволяет производить масштабирование изображения с гораздо меньшими потерями качества. Но об этом позже. Сейчас просто создадим изображение:

Функция imagecreatetruecolor (как, кстати, и функция imagecreate), принимает два обязательных целочисленных параметра — ширину (в нашем примере — 80 пикселей) и высоту (60 пикселей) картинки, и возвращает идентификатор ресурса (в данном случае — изображения), который мы присваиваем переменной $image, которой в дальнейшем будем постоянно пользоваться.

Если по какой-либо страшной причине (недостатке памяти, например) создать изображение не получается, функция возвращает false — в этом случае мы прерываем работу скрипта.

Хотя мы с этим изображением, пока что, ничего не делаем, мы обязаны освободить выделенную для него память с помощью функции imagedestroy(): к сожалению, автоматическое освобождение памяти происходит не всегда, и игнорирование рекомендации всегда использовать imagedestroy может привести к весьма серьезным утечкам памяти.

Немножко порисуем

Итак, с помощью функции imagecreatetruecolor() мы создали «труколорное» и, если верить документации, черное изображение размером 80×60. Так что, те, в чьи планы входит создание Web-галереи репродукций «квадрата Малевича», могут смело переходить к следующей главе. :) Для остальных, продолжим. Нарисуем на картинке что-нибудь содержательное.

Палка, палка, огуречик, вот и вышел человечек :)

Используемые для рисования функции весьма просты для понимания. Их описание (как и описание всех GD-функций) вы найдете здесь. В случае трудностей с английским, просто «поиграйтесь», меняя значения параметров — как вы, несомненно, уже догадались, это ни что иное, как координаты, и цвета в виде 0xRRGGBB.

Подробнее же мы разберем вот эту строку:
imagepng($image);

Выше мы создали в памяти изображение, и всячески над ним извращались. :) Это мы делали без привязки к какому-либо выходному формату — просто работали с набором байтов в памяти. А вот функции вида imageформат(imagepng(), imagejpeg(), imagewbmp(). ) генерируют на основе этого самого набора байтов, на который ссылается идентификатор $image, картинку в соответствующем формате, и выводят ее в выходной поток — то бишь, проще говоря, в броузер.

Нелишне здесь вспомнить и о строке header(‘Content-type: image/png’), где мы указали тип документа — обратите внимание: здесь png, и там png. :) Справедливости ради, надо заметить, что большинство броузеров воспринимают только часть «image» этого заголовка, а формат самой картинки уже определяют по ее заголовкам, характерным для каждого формата; однако, лучше все же не надеяться на «интеллект» броузера и указывать правильный формат изображения.

Вывод текста, а также диаграммы и коллекционеры марок

Используя полученные в результате рисования смайликов знания, попробуем порисовать диаграммы, а заодно и научимся выводить на картинках текст (не забудьте только о библиотеке FreeType, о необходимости наличия которой сказано в главе «Сборка».

Предположим, вы располагаете следующей важной статистической информацией о коллекционерах почтовых марок:

. и горите желанием представить эту информацию в виде «столбиков» — для удобного сравнения. Столбики мы рисовать уже умеем — стоит только немножко вспомнить азы арифметики:

Обратите внимание на строку
imagestring($image, 1, GRAPH_OFFSET_LEFT / 2, $Y — 4, $value, 0x000000);
с помощью которой мы выводим числа на координатной оси. Второй параметр — один из встроенных в GD шрифтов (от 1 до 5, чем больше число — тем крупнее шрифт).

Так зачем же, скажете вы, нам какие-то там TrueType-шрифты и FreeType-библиотеки, если мы и так прекрасно пишем на картинке? А вот затем, скажу я вам, что писать-то мы хотим по-русски, а встроенные шрифты о существовании кириллицы даже и не подозревают. А нам надо бы подписать столбики именно по-русски. Да и выбор встроенных шрифтов невелик.

Итак, нам понадобится:

— Функция imagettftext(), которая рисует выбранным TrueType-шрифтом на картинке,

— Какой-нибудь кириллический TrueType-шрифт. Возьмем, например, arial.ttf из всеми нами любимой Винды, да не просто возьмем, а положим его туда, где лежит наш скрипт,

— Поскольку функция imagettftext() воспринимает кодировку Unicode, но никак не Windows-1251, то нам пригодится вот такая функция для соответствующего преобразования:

— Функция imagettfbbox(), которая поможет нам вычислить высоту и ширину выводимого шрифтом текста.

Тренировка прошла успешно — всех поприветствовали. Можно теперь приступать к нашим диаграммам.

Барабанная дробь. Запускаем.

Изменение размера: thumbnails, или «превьюшки»

Часто перед веб-разработчиком стоит задача генерации уменьшенных копий изображений для предварительного просмотра; можно даже сказать, что это — одно из самых распространенных применений библиотеки GD.

В GD1, поддерживающей только изображения на основе палитры, присуствовала лишь функцияimagecopyresized(); качество уменьшенных изображений, генерируемых этой ей, мягко говоря, оставляло желать лучшего: работая с фиксированной палитрой, ограниченной 255 цветами, весьма затруднительно обеспечить качественный антиалиасинг.

Во второй версии библиотеки, с появлением поддержки TrueColor и imagecreatetruecolor(), введена новая функция — imagecopyresampled(), обеспечивающая весьма достойное качество «превьюшек».

Продемонстрируем работу с этой функцией. Предположим, у нас есть файл original.jpg, допустим, 400×250 пикселей, и мы хотим создать ее уменьшенный вариант small.jpg — 100×60. Можно поступить так:

Этот код работает, однако искажения, получаемые при непропорциональном изменении размера, выглядят не особенно симпатично. Более того, код получился не особенно-то универсальным: мало того, что мы можем работать только с JPEG-файлами, у нас еще и жестко заданы имена файлов и размеры получаемого изображения.

Итак, пусть у нас есть файл в любом поддерживаемом GD формате, и мы хотим создать «превьюшку» заданного размера в формате JPEG. Разработаем для этой цели функцию imgResize. Комментариев здесь почти не будет — так как используются уже изученные приемы и обычная арифметика. Постарайтесь разобраться в этом коде самостоятельно.

Разобрались? Поместим этот код в файл imgresize.php.

Пример использования функции img_resize:

Работа с изображениями на PHP с использованием GD

Интернет будет довольно скучным без изображений. Тем не менее, поддержка и управление сотнями или тысячами изображений для вашего веб-сайта может быть головной болью. По мере изменения дизайна вашего сайта вам может потребоваться изменить все ваши изображения — например, преобразовать все ваши изображения в оттенки серого или изменить их размер до 50% от их первоначального размера. Вы также можете сжимать или обрезать разные изображения. Выполнение этого вручную занимает много времени и подвержено ошибкам, но с небольшим знанием программирования оно может быть автоматизировано.

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

Что такое GD?

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

PHP может удовлетворить практически все ваши основные потребности в управлении изображениями, используя библиотеку GD — сокращение для Graphic Draw.

Установка

Если вы работаете в Windows, вы можете включить файл php_gd2.dll в качестве расширения в php.ini. Если вы используете что-то вроде XAMPP, вы найдете файл php_gd2.dll в каталоге xampp\php\ext. Вы также можете проверить, установлена ли GD в вашей системе, с помощью функции phpinfo(); . Если вы просмотрите полученный результат, вы найдете что-то похожее на следующее.

Вы также можете посетить страницу требований и установки, чтобы узнать больше об установке.

Создание изображений с помощью PHP GD

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

Создание нового изображения

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

Загрузка файла изображения

Если вы планируете работать с изображениями, которые уже хранятся где-то, вам пригодится использование таких функций, как imagecreatefromjpeg() , imagecreatefrompng() и imagecreatefromgif() . Они создадут ресурс изображения со всеми данными из загруженного файла изображения. Эти функции принимают единственный параметр, который указывает местоположение загружаемого изображения, как URL-адрес или путь к файлу.

Создание изображения из строки

Библиотека GD также позволяет создавать изображения из строки, используя функцию imagecreatefromstring() в PHP. Помните, что вам нужно будет использовать base64_decode() для данной строки перед imagecreatefromstring() . Функция может автоматически определять, является ли тип изображения JPG, PNG, GIF или другим поддерживаемым форматом.

Вращение, масштабирование, обрезка и переворот изображения

Некоторые общие операции, которые вы можете выполнять на ресурсе изображения, — это вращение, масштабирование, обрезка и переворот.

Вращение

Вы можете повернуть изображение, которое вы уже загрузили в скрипт, используя функцию imagerotate() . Она будет вращать изображение под заданным углом, используя центр изображения в качестве центра вращения. Угол представлен как значение с плавающей точкой, и PHP считает, что это значение угла вращения. Иногда повернутое изображение будет иметь разные размеры по сравнению с исходной версией. Это означает, что после поворота вы получите некоторую открытую область. Третий параметр функции imagerotate() может использоваться для задания цвета фона пустой области после вращения.

Масштабирование

Очень просто масштабировать изображение с помощью библиотеки GD. Вам просто нужно передать ресурс изображения, а также ширину и высоту в функцию imagescale() . Если вы опустите высоту, GD будет масштабировать изображение до указанной ширины, сохраняя соотношение сторон. Вы также можете указать режим масштабирования изображения. Его можно установить в IMG_NEAREST_NEIGHBOUR , IMG_BILINEAR_FIXED , IMG_BICUBIC и т.д. Важная вещь, которую вам нужно запомнить, это то, что эта функция возвращает новый источник масштабированного изображения вместо того, чтобы изменять исходный.

Обрезка

Вы можете обрезать любой ресурс изображения с помощью функции imagecrop() в GD. Первый параметр — исходный ресурс изображения, а второй параметр — ассоциативный массив с ключами x , y , width и height , определяющий размеры позиции окна обрезки.

Изображение бабочки выше было обрезано с использованием следующего кода:

В основном, мы сохраняем длину самой маленькой стороны в переменной $size . Затем эта переменная используется для определения границы нашего прямоугольника обрезки. Наконец, изображение уменьшено таким образом, что оно составляет всего 300 пикселей в ширину и длину. Это дает нам квадратное изображение.


Переворот изображений

Изображения можно перевернуть горизонтально, вертикально или в обоих направлениях с помощью функции imageflip() . Она принимает ресурс изображения, который вы хотите перевернуть, в качестве первого параметра, и режим переворота в качестве второго параметра. Режим переворота может быть установлен на IMG_FLIP_HORIZONTAL , IMG_FLIP_VERTICAL или IMG_FLIP_BOTH .

Верхнее левое изображение на приведенном выше рисунке является оригиналом. Верхнее правое изображение было создано с помощью IMG_FLIP_HORIZONTAL , нижнее левое изображение было создано с использованием IMG_FLIP_VERTICAL , а нижнее правое изображение — с помощью IMG_FLIP_BOTH . (Изображение вороны от Pixabay.)

Применение фильтров к изображению

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

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

  • IMG_FILTER_NEGATE : обращает (меняет как в негативе) цвета на изображении
  • IMG_FILTER_GRAYSCALE : удаляет цвет из изображения
  • IMG_FILTER_BRIGHTNESS : делает изображение ярче или темнее
  • IMG_FILTER_CONTRAST : увеличивает контрастность изображения
  • IMG_FILTER_COLORIZE : оттеняет изображение в выбранный цвет
  • IMG_FILTER_EDGEDETECT : выделяет края изображения
  • IMG_FILTER_EMBOSS : похоже на обнаружение краев, но придает каждому краю приподнятый вид
  • IMG_FILTER_GAUSSIAN_BLUR : размывает изображение с использованием метода Гаусса
  • IMG_FILTER_SELECTIVE_BLUR : размывает изображение с помощью выборочного метода
  • IMG_FILTER_MEAN_REMOVAL : эффект создания стилизованного изображения
  • IMG_FILTER_SMOOTH : сглаживает зубчатые края изображения
  • IMG_FILTER_PIXELATE : делает изображение пикселизированным

Некоторые фильтры, такие как NEGATE , GRAYSCALE , EDGE_DETECT и EMBOSS , не нуждаются в дополнительных данных. Другие фильтры, такие как BRIGHTNESS , CONTRAST и SMOOTH , могут принимать дополнительный параметр, который определяет количество яркости, контрастности или гладкости конечного изображения. Параметр PIXELATE позволяет указать два дополнительных параметра: размер блока, а также режим пикселизации. Наконец, фильтр COLORIZE принимает четыре параметра, которые определяют значения для red, green и blue компонентов, а также альфа-канала.

Изображение в левом верхнем углу является оригиналом. Верхнее правое изображение было создано с использованием фильтра COLORIZE , нижний левый был создан с использованием фильтра GRAYSCALE , а изображение в правом нижнем углу было создано с использованием фильтра BRIGHTNESS . (Это изображение бабочки было найдено в Pixabay.)

Другие полезные функции для работы с изображениями

Вы также должны знать о некоторых других общих функциях GD, которые могут быть полезны время от времени.

Получение размеров изображения

Вы можете определить ширину и высоту ресурса изображения с помощью функций imagesx() и imagesy() .

Другая функция, называемая getimagesize() , также может использоваться для получения ширины и высоты изображения вместе с его типом. Эта функция возвращает массив с элементами, определяющими ширину, высоту и формат изображения. Первые два элемента массива описывают ширину и высоту, а третий элемент содержит константу, определяющую формат файла: один из IMAGETYPE_PNG , IMAGETYPE_GIF и т.д.

Сохранение изображения

После того, как вы внесете все необходимые изменения в изображение, вы, скорее всего, захотите либо вывести его в браузер, либо сохранить его как файл. В любом случае вам придется использовать одну из функций вывода GD, таких как imagejepg() , imagepng() или imagegif() . Вы передадите свой ресурс изображения одной из этих функций вывода, и если вы хотите сохранить изображение в файл, вы также укажете имя файла. Вы также можете управлять качеством выходного изображения с помощью третьего необязательного параметра в зависимости от типа изображения.

Изменение размера всех изображений в каталоге

Давайте применим на практике полученные нами знания, чтобы сделать что-нибудь. В этом разделе мы изменим размер всех изображений JPEG в определенном каталоге на ширину 640 пикселей. Высота будет рассчитываться автоматически в зависимости от размеров исходного изображения.

Мы сохраним измененные изображения в новой папке под названием Resized. Все исходные изображения в этом случае имеют одинаковые размеры, но код будет работать правильно и с изображениями, имеющими разные размеры и пропорции.

В приведенном выше коде мы начнем с использования функции glob() , чтобы найти все изображения с расширением .jpg в каталоге под названием Nature. Файлы изображений хранятся в массиве, и мы поочередно перебираем их.

Поскольку все изображения, которые мы хотим изменить, являются JPEG, мы используем функцию imagecreatefromjpeg() , чтобы загрузить их в скрипт. Затем используется функция imagescale() для изменения размера изображения до определенной ширины — 640 пикселей в нашем случае. Мы не указали фиксированную высоту, чтобы высота была рассчитана автоматически.

К каждому из исходных файлов изображений было добавлено -1920×1080 к их имени файла, чтобы указать его размеры. Мы используем str_replace() в исходном имени файла и заменяем -1920X1080 на новый размер изображения.

Наконец, мы сохраняем измененные изображения в папке с именем Resize с новыми именами файлов. Вы также можете передать третий параметр функции imagejpeg() , чтобы установить качество сохраненного файла изображения. Если третий параметр опущен, изображения сохраняются с качеством по умолчанию 75.

Применение оттенков серого и контрастных фильтров для каждого изображения в каталоге

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

Как вы можете видеть, мы загружаем изображения из каталога Nature так же, как и в предыдущем примере. Однако на этот раз мы будем использовать функцию imagefilter() для применения фильтров на загруженном ресурсе изображения.

Обратите внимание, что imagefilter() изменяет исходное изображение и возвращает TRUE или FALSE в зависимости от успеха или провала операции. Это отличается от функции imagescale() , которую мы использовали в предыдущем разделе, которая вернула масштабированный ресурс изображения.

Еще одна важная вещь, которую следует иметь в виду, заключается в том, что контрастный фильтр принимает значения от -100 до 100. Отрицательные значения подразумевают большую контрастность, а положительные значения означают меньший контраст. Это противоположно тому, что могут ожидать некоторые люди! Значение 0 оставляет изображение неизменным.

С другой стороны, фильтр яркости имеет минимальный и максимальный пределы -255 и 255. Отрицательное значение в этом случае подразумевает минимальную яркость, а положительное значение означает максимальную яркость.

Мы получаем имя файла из пути файла, используя функцию basename() , а затем сохраняем изображение с помощью функции imagejpeg() .

Заключительные мысли

Цель этого урока состояла в том, чтобы познакомить вас с библиотекой GD на PHP и узнать, как использовать все ее функции, чтобы сделать вашу жизнь проще. Вы можете использовать примеры в конце урока в качестве руководства для написания собственных скриптов работы с изображениями. Например, вы можете изменить размер изображения только в том случае, если оно больше заданного предела, определяя его ширину с помощью функции imagesx() .

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

Перестаньте изобретать изобретенное: 8 полезных PHP библиотек, которые заменят ваши велосипеды

Многие программисты при выполнении каких-то задач пишут свои собственные решения, часто забывая о том, что эта же задача, скорее всего, уже давно решена другим разработчиком намного эффективней и качественней.

Tproger собрал 8 существующих библиотек и инструментов, функциональность которых чаще всего реализуют самостоятельно. Они пригодятся любому веб-разработчику: если не сейчас, то в будущем их знание избавит вас от траты времени на написание своих велосипедов.

Imanee

Пожалуйста, хватит писать свои функции для работы с графикой!

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

ZIP Service, Москва, можно удалённо, от 100 000 ₽

Чтобы окончательно убедить вас не писать что-то своё, приведем несколько примеров.

Создать гифку, включающую в себя, например, все изображения в папке, можно всего одной строкой:

То же самое касается и установки на изображение своего копирайта:

Официальный GitHub репозиторий: Imanee

Сайт с документацией и котиком: Imanee.io

PHP Benchmark

Перестаньте писать свои решения с запоминанием таймстампов в переменные и сравнением, ваши проблемы решает PHP Benchmark — бесплатная библиотека с открытыми исходниками.

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

Подключив PHP Benchmark и прописав в нужных местах следующую строчку:

можно получить детальный отчет по работе приложения.

Вот пример для популярной платформы WordPress:

Подробную документацию, как и исходники, вы можете найти на гитхабе: PHP-Benchmark

RegExp Builder

Являясь бесплатным портом известной JavaScript библиотеки, PHP RegExp Builder позволяет полностью забыть о регулярках, их синтаксисе и искусстве написания. С использованием этого инструмента валидацию, поиск и замену сложных по структуре данных — основные области применения регулярных выражений — стало делать ещё проще.

Выражения, созданные в Builder’е, легко читать и изменять — всё состоит из так называемых «цепочек».

Пример создания регулярного выражения с RegExp Builder:

Скачать библиотеку можно на GitHub: RegExp Builder

Там же доступна и документация: RegExp Builder Wiki

PHP FaceDetection

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

PHP FaceDetection — это серверная адаптация одноименного JS-фреймворка от Котика Тхеравада, с помощью которой, написав всего пару строчек, вы получите координаты лица на изображении в удобном формате.

Mobile Detect

Mobile Detect — легковесный класс с открытым исходным кодом, предназначенный для определения модели мобильного устройства клиента. Для «детекта» он использует User-Agent в сочетании с HTTP заголовками и свою обширную базу данных — это делает количество ложных срабатываний минимальным.

Даже несмотря на то, что для адаптивного дизайна сегодня используются Media Queries, скрипт всё равно может быть полезен: например, вы можете отдавать мобильным пользователям более легковесные изображения, тем самым ускоряя загрузку сайта.

Документация и ссылка на скачивание: mobiledetect.net


ABLincoln

ABLinkoln — написанная на PHP реализация фреймворка PlanOut от Facebook, предназначенного для A/B тестов — тестов, использующихся для оценки эффективности веб-страницы и повышения конверсии, или, другими словами, сплит-тестирования.

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

Например, чтобы поставить эксперимент с двумя видами надписи и цвета кнопки, нужно создать вот такой простой класс:

Документация, исходники и примеры кода — на GitHub.

phpQuery

Задача спарсить некую информацию со стороннего сайта встает перед веб-разработчиком очень часто: таким образом можно заполнить контентом собственный сайт, динамически подгрузить какую-то информацию и многое другое.

Ранее мы уже делали подборку лучших инструментов для парсинга веб-страниц средствами PHP. Согласно результатам того исследования, наиболее универсальной оказалась библиотека phpQuery.

Это, по сути, PHP вариант jQuery, обладающий почти всем, что есть в оригинале. Помимо удобства использования, phpQuery еще и гораздо быстрее своих конкурентов, а значит, лучше всего подойдет для работы с большим объемом данных.

Вот небольшой пример использования phpQuery для обработки элементов списка (li):

Библиотека и документация к ней доступны на официальной странице в Google Code.

mPDF — одна из лучших библиотек для генерации документов в формате PDF. В отличие от своих конкурентов, mPDF в полной мере поддерживает русский язык, вставку картинок, форматирование и, самое главное, HTML и CSS.

Основанный на открытом движке инструмент очень прост в использовании: на вход вы подаете почти обычную веб-страницу — на выходе получаете полноценный PDF.

Более подробную документацию, пример кода и ссылку на скачивание вы найдете на официальном сайте: mpdf1.com

Создание изображений средствами PHP

Эта статья рассчитано на программистов со средним уровнем знания PHP.
Введение

PHP не только идеально подходит для вывода HTML страниц, но также включает в себя мощные средства создания изображений «на лету». Приведу лишь несколько примеров:

* Создание кнопок с надписями, текст которых хранится в базе данных
* Графическое отображение статистических данных
* Создание различных графиков и диаграмм

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

Цель этой статьи

В статье освещаются следующие вопросы:

* Что такое заголовки (headers)
* Использование функций библиотеки GD для динамического создания изображений средствами PHP
* Использование HTTP заголовков для указания браузеру, что вывод PHP-скрипта представляет собой изображение

Создание заголовка

По умолчанию, PHP выводит один заголовок: Content-type: text/html, означающий, что результатом работы скрипта является HTML код

Как видите, PHP выводит Content-type: text/html и пустую строку, прежде чем выводить результат работы скрипта . Все до пустой строки является заголовком HTTP. Заголовок содержит информацию для браузера и не отображается на экране.

Используемый по умолчанию заголовок Content-type: text/html показывает, что выводится HTML код, который браузер должен обработать. Если изменить его скажем на Content-type: text/plain, то браузер будет воспринимать документ просто как текст и выводить его «как есть» Для вывода заголовков в PHP используется функция header().

Конечно, послать заголовок недостаточно, нужно еще и позаботиться о том, чтобы вывести данные в нужном формате. Не следует думать, что, просто послав заголовок Content-type: application/zip и выведя «Всем привет», вы сможете открыть результат работы такого скрипта с помощью WinZip’а.

Примечание Web-сервер перед отправкой данных клиенту может добавлять и другие заголовки помимо Content-type, их рассмотрение выходит за рамки данной статьи.

Что нам потребуется

Создание изображений в PHP требует наличия библиотеки GD написанной Thomas Boutell . (http://www.boutell.com/gd) Поддержка этой библиотеки включается при компиляции PHP с опцией —with-gd. Для работы с TrueType шрифтами также может понадобиться библиотека FreeType (http://www.freetype.org). Установка обеих библиотек подробно описана в соответствующей документации.

Создаем изображения

Генерация изображения состоит из трех основных этапов:

* Создание изображения
* Отрисовка изображения
* Вывод полученной картинки в браузер

Для создания изображения используется функция ImageCreate(). В качестве аргументов функция принимает ширину и высоту изображения в пикселах и возвращает идентификатор, который в дальнейшем используется при вызове функция для работы с изображением.

Перед тем, как что-либо рисовать, необходимо зарегистрировать цвета, которые вы собираетесь использовать. Для этого предназначена функция ImageColorAllocate(). Этой функции передаются идентификатор изображения и три числа, задающие цвет (RGB — red, green, blue). Функция возвращает идентификатор цвета, который используется в последующих операциях отрисовки изображения.
Пример:

Существует большое количество функций отрисовки изображений. Полное их рассмотрение выходит за рамки данной статьи. Для ознакомления с этими функциями, обратитесь к руководству по PHP.

И, наконец, вывод изображения осуществляется вызовом функции ImagePNG() или ImageGIF(). Последняя не поддерживается в текущей версии GD из-за проблем с лицензированием (разработчики GD обещают возобновить поддержку формата GIF после 7 июля 2004 года, когда истечет срок действия патентов Unisys на алгоритм сжатия LZW, используемый в GIF. Уже после написания этой статьи в библиотеку была включена поддержка форматов JPEG и WBMP. -прим. переводчика). ImagePNG() преобразует внутреннее представление изображения в PNG файл и посылает его клиенту. Аналогично работает и ImageGIF(), но используя формат GIF. Перед использованием функций ImagePNG() или ImageGIF() необходимо послать соответствующий заголовок Content-type
Формат Заголовок
PNG «Content-type: image/png»
GIF «Content-type: image/gif»

Примечание Заголовки относятся ко всему документу. То есть если вы послали заголовок, показывающий, что вы выводите изображение, вы не можете выводить текст. А после того, как вы вывели первый байт данных, заголовок уже нельзя изменить! Это значит, что сначала нужно вызвать header() и только затем начинать вывод данных, иначе вы получите сообщение об ошибке. Если вы не посылаете заголовок Content-type, PHP автоматически посылает Content-type: text/html как только вы начинаете вывод данных.

Как это выглядит на практике

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

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

У каждой кривой собственный цикл:

* Физическая: 23 дня
* Эмоциональная: 28 дней
* Интеллектуальная: 33 дня

Кривые представляют собой синусоиды, поэтому для вычисления значений биоритмов мы можем воспользоваться встроенной функцией sin()

Установка даты рождения

Сначала мы должны получить дату рождения и вычислить, сколько дней человек прожил до текущей даты. Результат будет использован для вычисления текущей фазы биоритма.

* Проверяем, была ли введена дата рождения.
* Если нет, отображаем форму для ввода даты
* После проверки правильности ввода вычисляем сколько дней человек прожил до текущей даты используя юлианский календарь.

Совет Для вычисления мы используем юлианский календарь. Дата рождения и текущая дата переводятся в количество дней по юлианскому календарю. Разность этих двух чисел дает искомый результат.

Примечание В этом примере функция gregorianToJD() реализована на PHP (см. полный код скрипта ниже). Вообще-то, эта функция реализована в календарном модуле PHP, но на момент написания этой статьи эта функция работала некорректно в последней версии PHP. Поэтому была использована «самодельная» функция. Если в вашем PHP включена поддержка функций работы с календарем, вам нужно удалить определение этой функции из кода в примере.

Подготовка изображения

Порядок действий Подготовка к рисованию состоит из вызова нескольких функций GD. Следующий участок кода:

* Создает изображение нужных размеров.
* Регистрирует используемые цвета.
* Очищает изображения, заливая его цветом фона

Совет Перед началом отрисовки изображения залейте его цветом фона. Это гарантирует, что фон изображения будет того цвета, что вам нужен. Это также полезно для создания прозрачного фона, как будет показано далее.

Примечание Для простоты изложения, примеры в этой статье не содержат проверок ошибок. «Настоящий» скрипт обязательно должен включать проверки на ошибки

Рисуем рамку и выводим текст

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

* Рисуем рамку, внутри которой будет размещен график, и оси
* Выводим текст примечаний

Рисунок 1. График биоритмов

Рисуем кривые

Графики биоритмов представляют собой синусоиды, отличающиеся только периодом, поэтому мы определяем функцию drawRythm() , которая отображает синусоиду с заданным периодом. Эта функция будет вычислять значения биоритмов для каждого дня в заданном периоде и соединять полученные точки линиями.

* Функция drawRhythm вызывается три раза с различными параметрами
* Функция drawRhythm содержит цикл, который вычисляет значение биоритма для каждого дня, и рисует линии.

Совет Для получения более плавной кривой следовало бы при вычислениях использовать интервалы меньшие чем один день, однако для целей этой статьи полученного качества изображения вполне достаточно.

Вывод изображения клиенту

Итак, мы нарисовали наш график. Теперь остается отправить это изображение в браузер.

* Посылаем заголовок, показывающий что мы выводим изображение в формате GIF или PNG.
* Определяем чересстрочный формат вывода изображения.
* Делаем цвет фона прозрачным.
* Используя функцию imageGIF или imagePNG выводим изображение.

Совет После вызова imageGIF или imagePNG, изменения в изображение вносить уже нельзя, так как оно уже было отправлено клиенту.


Использование ImageInterlace() позволяет задать режим чересстрочного или прогрессивного вывода изображения (если используемый формат изображения позволяет это). Этот режим интересен тем, что позволяет браузеру начать отображение картинки еще до ее полной загрузки. Сначала выводится изображение с низким качеством, которое улучшается по мере загрузки данных. Это незаменимо при передаче больших изображений по низкоскоростным каналам.

Функция ImageColorTransparent() задает цвет прозрачных участков изображения (опять же, если используемый формат позволяет это). В нашем примере мы используем цвет, сохраненный в переменной $colorBackgr, делая участки изображения, нарисованные этим цветом, прозрачными.
Как использовать полученное изображение

Итак, мы написали программу, создающую изображение. Как ее использовать? На самом деле все очень просто: Вы можете использовать скрипт в HTML коде как обычный файл изображения. Поскольку скрипт в нашем примере является интерактивным, то для его использования нам нужно ввести http://my.server.net/script.php в адресную строку браузера. Для скрипта, не требующего пользовательского ввода, например получающего информацию из базы данных, просто вставьте в HTML код страницы тэг такого содержания:

Полный код скрипта

Заключение

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

Работа c графической библиотекой PHP GD library. Часть первая.

Если вы заядлый PHP разработчик, вы, наверняка, не только наслышаны о графической библиотеке GD library. Для тех, кто с ней не знаком, поясняю GD library позволяет создавать изображения, видоизменять и управлять ими без особых усилий. Сегодня, мы познакомимся с азами использования в PHP графической библиотеки GD library.

Прежде всего

Убедитесь, что GD библиотека установлена и активирована на вашем сервере. Не знаете как это сделать? Не переживайте, все просто! Вам только нужно создать PHP файл на сервере, затем введите следующее:

Теперь откройте страницу браузера и вы увидите громадный список возможностей вашей версии PHP. Прокрутите страницу немного вниз, найдите секцию ‘GD’ и убедитесь, что библиотека подключена. Если нет, свяжитесь с компанией, предоставляющей вам услуги хостинга. К счастью, на большинстве серверов, на которых я уже успел поработать и работаю, GD библиотека установлена и подключена.

Основные моменты

Давайте пройдемся по некоторым основным моментам. Во-первых, сделаем так, чтобы все отчеты об ошибках выдавались браузером. Этого можно добиться, введя в самом начале вашего php-кода следующее:

Нарисуем квадрат

Давайте начнем с самого простого и нарисуем с помощью PHP синий квадрат — ничего сверхъестественного, конечно, но надо же разобраться с основами. Чтобы получить желаемый квадрат, необходимо выполнить следующие действия:

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

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

Теперь давайте рассмотрим все использованные функции и каждый шаг вышеприведенного кода, чтобы лучше понять, что именно мы в нем делаем:

• Как я уже пояснял, мы добавляем опцию сообщения об ошибках, чтобы в случае необходимости быстро их исправить
• Затем мы используем функцию header(), чтобы установить тип содержимого – png
• Сохраняем изображение и устанавливаем необходимую ширину и высоту – более подробно см. imagecreate()
• Затем используем функцию imagecolorallocate, чтобы выбрать синий цвет для фона нашего рисунка. Обратите внимание, что в окончательном варианте будет виден цвет, установленный в первую очередь, так что наш квадрат получится синим, а не красным.
• Для окончательного сохранения рисунка мы используем imagepng(). Если вы желаете сохранить рисунок в каком-либо каталоге, следует ввести дополнительные параметры.
• И, наконец, мы чистим память с помощью функции imagedestroy()

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

Если все было сделано правильно, вы увидите вот такой синий квадрат:

Привет, Мир

Теперь, когда мы научились создавать изображения, давайте попробуем сделать изображение с текстом, написанным выбранным нами шрифтом. Мы можем воспользоваться любым шрифтом из каталога TrueType Font (.tff). В следующих примерах я буду использовать шрифт ‘Advent’. Давайте напишем «Hello World» на темно-сером квадрате. Внимание, смотрим на код, а затем подробно разбираем каждый шаг.

Сохраним код в файле ‘hello_world.php’и будем открывать его таким же способом, какой был указан выше. Итак, что здесь нового?

• Мы установили размер изображения 300*300 пикселей и использовали темно-серый фон
• Обратите внимание, как мы указывали путь к шрифту, используя имя шрифта: дело в том, что далее в коде нам придется накладывать текст на изображение. Кроме того, не забывайте, что имя шрифта пишется без расширения. Впрочем, это зависит от того, какую версию GD-библиотеки использует PHP: если названием шрифта не начинается с ‘/’, то потребуется расширение ttf – то есть, если перед названием файла нашего шрифта не стоит /, то в конце будет автоматически добавлено ttf.
• Затем мы пишем «Hello World!» и сохраняем текст для дальнейшего использования
• Важнейшая функция, использованная в этом коде – это imagettftext(), требующая указания 8 параметров: путь к изображению, размер изображения, угол наклона, ось x, ось y, цвет, шрифт, текст (в таком порядке)

Сохраните код, откройте его любым способом, и вы увидите вот такую картинку:

Поверните его!

Вы заметили, что у функкции imagettftext, соединяющей текст и картинку, есть параметр расположить под углом’? Значит, мы можем повернуть наш текст под любым углом. Давайте перепишем код и повернем строчку на квадрате.

Обратите внимание, мы установили значение -45 градусов вместо 0 градусов (как в предыдущем примере) – это все, что требуется для того, чтобы повернуть текст. Посмотрите на картинку.

Ну как? Интересно? Нет? Тогда давайте попробуем заняться чем-нибудь более практичным.

Какое сегодня число?

Мы можем не только сами рисовать картинки, но и использовать готовые! Немного кодировки, и у нас получится календарик, отображающий текущую дату (месяц, день и год). Ищем в Google заготовку для календаря, находим изображение в формате .svg – я изменил его размер и перевел в формат png. Посмотрите на заготовку:

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

Итак, что мы здесь делаем? Что за функция list()? Давайте разберемся:

• Как всегда, мы устанавливаем тип содержимого, чтобы картинка отображалась правильно.
• В 10-й строчке вы видите функцию list function. Мы определяем формат даты с помощью функции explode() и сохраняем его. Таким образом можно упорядочивать любую информацию. Теперь нам открыт доступ к сведениям о текущем месяце, дне и годе.
• В строчках 22-24 мы пользуемся функцией imagettfbbox(), чтобы организовать формат даты. Функция обеспечивает отображение даты в заданном порядке, а для доступа к правому нижнему углу мы пишем $pos_month. Все это нужно для того, чтобы текст автоматически располагался правильно, не зависимо от его размера.
• Затем мы создаем каждую строчку по очереди и устанавливаем размер текста по оси Х.

Если не произошло никаких катастроф, у вас должна получиться представленная ниже картинка, с той лишь разницей, что дата будет той, что установлена на вашем компьютере – мой рисунок, как вы можете догадаться, статичен. За помощь со скриптом спасибо сайту catpin.

Кошки и фильтры изображений

Последнее, чему я сегодня вас научу, это фильтры изображений – очень интересная штука, поверьте мне. Функция imagefilter() берет готовое изображение и определенным образом изменяет его – например, переводит в черно-белый режим. Давайте посмотрим на картинку, с которой мы будем работать, в ее первоначальном виде.

А теперь сделаем кота черно-белым с помощью функции фильтрации изображений.

Вышеприведенный скрипт является достаточно гибким, так что вы без труда сможете сделать любой рисунок черно-белым – вот так:

Ставим в «источник» любую картинку, и вскоре она станет черно-белой. Тем, кто планирует использовать эту функцию на общедоступных серверах, потребуются дополнительные меры безопасности. Хотя в вышеприведенном скрипте указано изображение типа .jpeg, вы можете применять функцию для обработки любых графических файлов. Теперь наш кот выглядит так:

Другие фильтры:

В завершение урока я познакомлю вас с некоторыми другими графическими фильтрами и результатами их применения

Фильтр яркости

За яркость изображения отвечает третий параметр:

Гауссово размывание

Размывание по Гауссу, никаких дополнительных параметров

Контрастность

Третий параметр определяет контрастность

Удаление среднего значения (эффект рисунка)

Никаких дополнительных параметров.

Цветовой баланс

Устанавливает насыщенность красного, зеленого, синего цветов, а также альфа-канала (по желанию) в перечисленном порядке

До новых встреч.

Надеюсь, что вы более или менее разобрались с использованием в PHP библиотеки GD. Во второй части мы рассмотрим некоторые продвинутые техники и, конечно, узнаем еще больше интересного. Используйте библиотеку GD и свои творческие способности и обязательно расскажите мне, что у вас получилось!

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.blog.themeforest.net
Перевел: Максим Шкурупий
Урок создан: 19 Октября 2009
Просмотров: 69492
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

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

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Илон Маск рекомендует:  Что такое код socket_get_status
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL