работа с изображением php
Функции графических изображений
PHP не ограничен только созданием HTML вывода. PHP может также использоваться для создания и управления различными форматами изображений, включая GIF, PNG, JPG, WBMP, и XPM. Для большего удобства, PHP может вывести потоки изображения непосредственно в браузер. Для того, чтобы использовать замечательную возможность создания изображения с помощью PHP, вам необходимо иметь библиотеку функций изображений GD. GD и PHP может также требовать других библиотек, в зависимости от того, с какими форматами изображений вы хотите работать.
Вы можете использовать функции изображений в PHP, чтобы получить возможность работать с JPEG, GIF, PNG, SWF, TIFF и изображениями JPEG2000.
Замечание: Читайте раздел требований о том, как развернуть возможности читать изображения, сохранять, изменять изображения и читать мета данные изображений, представленных цифровыми камерами.
Формат изображений, которыми вы можете управлять, зависит от версии GD, который вы устанавливаете. Версии GD старше, чем gd-1.6 поддерживают формат GIF, и не поддерживают PNG, а версии больше чем gd-1.6 и меньше чем gd-2.0.28 поддерживают PNG, но не поддерживают GIF. Поддержка формата GIF вновь стала возможной в gd-2.0.28.
Замечание: Для PHP, начиная с PHP 4.3, есть связанная версия GD lib. Эта связанная версия имеет некоторые дополнительные особенности подобно alpha blending, и должна использоваться в предпочтении к внешней библиотеке, так как ее код оптимизирован для PHP и более устойчив.
Вы можете захотеть расширить GD, чтобы иметь возможность работать с большим числом форматов изображений.
Таблица 1. Поддерживаемые форматы изображений
Формат | Библиотеки для скачивания | Примечания |
---|---|---|
gif | Поддерживаются только GD версий старше gd-1.6 и новее, чем gd-2.0.28. Только для чтения поддержка GIF доступна с PHP 4.3.0 связанной библиотекой GD. Поддержка записи доступна с PHP 4.3.9 aи с PHP 5.0.1. | |
jpeg-6b | ftp://ftp.uu.net/graphics/jpeg/ | |
png | http://www.libpng.org/pub/png/libpng.html | Поддерживается только библиотеками GD версий выше, чем gd-1.6. |
xpm | ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html | Вероятно, что у вас есть эта библиотека, если ваша система имеет установленную X-среду. |
Вы можете желать расширить GD, чтобы иметь дело с различными шрифтами. Следующие библиотеки шрифта поддерживаются:
Таблица 2. Поддерживаемые библиотеки шрифтов
Библиотека шрифтов | Ресурсы для скачивания | Примечания |
---|---|---|
FreeType 1.x | http://www.freetype.org/ | |
FreeType 2 | http://www.freetype.org/ | |
T1lib | ftp://sunsite.unc.edu/pub/Linux/libs/graphics/ ) | Поддержка шрифтов Type 1. |
Замечание: Для включения поддержки exif в Windows, php_mbstring.dll должен быть загружен перед php_exif.dll в php.ini.
Таблица 3. Поддерживаемые форматы изображений
Замечание: Когда вы компилируете PHP с libpng, вы должны использовать одинаковые версии, связанные с библиотекой GD.
Таблица 4. Поддерживаемые библиотеки шрифтов
Данное расширение не определяет никакие типы ресурсов.
Перечисленные ниже константы определены данным расширением и могут быть доступны только в том случае, если PHP был собран с поддержкой этого расширения или же в том случае, если данное расширение подгружается во время выполнения.
Введение
Замечание: Прочитайте раздел требований, чтобы узнать, как расширить возможности чтения, записи и модификации изображений. Чтобы иметь возможность читать мета-данные изображений, взятых с цифровых фотоаппаратов нужно, уже упомянутый модуль EXIF.
Замечание: Функция getimagesize() не требует наличия библиотеки GD.
Тогда как поставляемая с PHP библиотека GD использует менеджер памяти Zend, то системная нет. Соответственно ограничение memory_limit не работает.
GD поддерживает ряд форматов. Ниже приведён список этих форматов и пометки о доступности, включая поддержку чтения и записи.
Формат | Поддержка чтения | Поддержка записи | Примечания |
---|---|---|---|
JPEG | true | true | |
PNG | true | true | |
GIF | true | true | |
XBM | true | true | |
XPM | true | false | |
WBMP | true | true | |
WebP | true | true | |
BMP | true | true | Доступно с GD 2.1.0 и PHP 7.2.0 |
Работа с изображением 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 |
В нижеследующих строках мы видим, какие графические форматы поддерживаются данной конфигурацией библиотеки GD. В частности, работа с форматом GIF поддерживается в режиме «только чтение» из-за проблем с лицензированием используемого в GIF алгоритма компрессии.
Итак, если требуется пересборка PHP, следует это и сделать, загрузив при необходимости последнюю версию PHP, и указать при сборке параметр:
Для поддержки работы с шрифтами TrueType, обсуждаемой в главе «Вывод текста. «, также понадобится наличие библиотеки FreeType и следующие параметры конфигурационной строки:
Примечание: Для сборки GD с поддержкой GIF Write под FreeBSD, необходимо предварительно установить переменную среды WITH_LZW:
export WITH_LZW=yes
Генерация изображения с помощью PHP
Теперь приступим к написанию этого самого image.php.
Заголовок. Он же header.
Приступим теперь непосредственно к генерации картинки.
Создание изображения
Для создания изображения, в нашем распоряжении две функции:
1. imagecreate(). С помощью этой функции можно создать изображение на основе палитры, содержащей фиксированный набор цветов. Каждый цвет палитры необходимо описать с помощью функцииimagecolorallocate(). Этот способ создания изображения был единственным при работе с первой версией GD, и необходим при работе с ориентированными на палитру форматами, такими как GIF. Однако введенный во второй версии (и отныне рекомендуемый разработчиками) способ, на мой взгляд, гораздо более удобен.
2. imagecreatetruecolor(). Эта функция создает TrueColor-изображение, то есть цвет каждой точки определяется произвольным цветом, задаваемым в координатах RGB. Помимо того, что это удобнее, чем работа с палитрой, такой подход позволяет производить масштабирование изображения с гораздо меньшими потерями качества. Но об этом позже. Сейчас просто создадим изображение:
Хотя мы с этим изображением, пока что, ничего не делаем, мы обязаны освободить выделенную для него память с помощью функции imagedestroy(): к сожалению, автоматическое освобождение памяти происходит не всегда, и игнорирование рекомендации всегда использовать imagedestroy может привести к весьма серьезным утечкам памяти.
Немножко порисуем
Итак, с помощью функции imagecreatetruecolor() мы создали «труколорное» и, если верить документации, черное изображение размером 80×60. Так что, те, в чьи планы входит создание Web-галереи репродукций «квадрата Малевича», могут смело переходить к следующей главе. 🙂 Для остальных, продолжим. Нарисуем на картинке что-нибудь содержательное.
Палка, палка, огуречик, вот и вышел человечек 🙂
Подробнее же мы разберем вот эту строку:
imagepng($image);
Вывод текста, а также диаграммы и коллекционеры марок
Используя полученные в результате рисования смайликов знания, попробуем порисовать диаграммы, а заодно и научимся выводить на картинках текст (не забудьте только о библиотеке FreeType, о необходимости наличия которой сказано в главе «Сборка».
Предположим, вы располагаете следующей важной статистической информацией о коллекционерах почтовых марок:
Так зачем же, скажете вы, нам какие-то там TrueType-шрифты и FreeType-библиотеки, если мы и так прекрасно пишем на картинке? А вот затем, скажу я вам, что писать-то мы хотим по-русски, а встроенные шрифты о существовании кириллицы даже и не подозревают. А нам надо бы подписать столбики именно по-русски. Да и выбор встроенных шрифтов невелик.
Итак, нам понадобится:
— Функция imagettftext(), которая рисует выбранным TrueType-шрифтом на картинке,
— Какой-нибудь кириллический TrueType-шрифт. Возьмем, например, arial.ttf из всеми нами любимой Винды, да не просто возьмем, а положим его туда, где лежит наш скрипт,
— Поскольку функция imagettftext() воспринимает кодировку Unicode, но никак не Windows-1251, то нам пригодится вот такая функция для соответствующего преобразования:
— Функция imagettfbbox(), которая поможет нам вычислить высоту и ширину выводимого шрифтом текста.
Барабанная дробь. Запускаем.
Изменение размера: thumbnails, или «превьюшки»
В GD1, поддерживающей только изображения на основе палитры, присуствовала лишь функцияimagecopyresized(); качество уменьшенных изображений, генерируемых этой ей, мягко говоря, оставляло желать лучшего: работая с фиксированной палитрой, ограниченной 255 цветами, весьма затруднительно обеспечить качественный антиалиасинг.
Этот код работает, однако искажения, получаемые при непропорциональном изменении размера, выглядят не особенно симпатично. Более того, код получился не особенно-то универсальным: мало того, что мы можем работать только с JPEG-файлами, у нас еще и жестко заданы имена файлов и размеры получаемого изображения.
Разобрались? Поместим этот код в файл imgresize.php.
Пример использования функции img_resize:
original.jpg
small.jpg
Работа с изображениями на PHP с использованием GD
В этом уроке мы узнаем о библиотеке GD (Graphic Draw) в PHP. Вы увидите, как эту библиотеку можно использовать для управления изображениями путем изменения размера, обрезки, поворота или фильтрации.
Что такое GD?
PHP может сделать гораздо больше, чем просто отправлять HTML-сообщения посетителям. Например, он имеет возможность манипулировать изображениями. Не только это, но вы также можете создавать свои собственные изображения с нуля, а затем либо сохранять их, либо подавать их пользователям.
Установка
Вы также можете посетить страницу требований и установки, чтобы узнать больше об установке.
Создание изображений с помощью PHP GD
Первым шагом к манипулированию изображениями с помощью PHP является загрузка их в память в качестве ресурса изображения. Этого можно добиться с помощью различных функций для разных форматов. Все эти функции имеют очень похожие имена, поэтому их легко запомнить.
Создание нового изображения
Функция imagecreatetruecolor() окажется полезной, если у вас нет исходного источника изображения, которое вы хотите изменять. Она принимает два целочисленных параметра: ширину и высоту. Она вернет ресурс изображения, если все пойдет по плану. Возвращаемый ресурс изображения в основном представляет собой черное изображение с заданной шириной и высотой.
Загрузка файла изображения
Создание изображения из строки
Вращение, масштабирование, обрезка и переворот изображения
Вращение
Масштабирование
Обрезка
Изображение бабочки выше было обрезано с использованием следующего кода:
Переворот изображений
Применение фильтров к изображению
Для начала укажите ресурс изображения и имя фильтра, который вы хотите применить. Вы можете установить его на один из 12 предопределенных типов фильтров, упомянутых в документах.
Другие полезные функции для работы с изображениями
Вы также должны знать о некоторых других общих функциях GD, которые могут быть полезны время от времени.
Получение размеров изображения
Сохранение изображения
Изменение размера всех изображений в каталоге
Давайте применим на практике полученные нами знания, чтобы сделать что-нибудь. В этом разделе мы изменим размер всех изображений JPEG в определенном каталоге на ширину 640 пикселей. Высота будет рассчитываться автоматически в зависимости от размеров исходного изображения.
Мы сохраним измененные изображения в новой папке под названием Resized. Все исходные изображения в этом случае имеют одинаковые размеры, но код будет работать правильно и с изображениями, имеющими разные размеры и пропорции.
К каждому из исходных файлов изображений было добавлено -1920×1080 к их имени файла, чтобы указать его размеры. Мы используем str_replace() в исходном имени файла и заменяем -1920X1080 на новый размер изображения.
Применение оттенков серого и контрастных фильтров для каждого изображения в каталоге
На этот раз мы будем применять два разных фильтра для каждого изображения в нашем каталоге и сохранять конечный результат в другом каталоге без внесения каких-либо изменений в имя файла. Давайте погрузимся в код, и я позже объясню, что делает каждая функция.
Как вы можете видеть, мы загружаем изображения из каталога Nature так же, как и в предыдущем примере. Однако на этот раз мы будем использовать функцию imagefilter() для применения фильтров на загруженном ресурсе изображения.
Заключительные мысли
Все эти функции открывают множество возможностей для облегчения работы с изображениями и в конечном итоге сэкономят вам много времени. Если у вас есть какие-либо вопросы, связанные с этим учебным руководством, пожалуйста, дайте мне знать в комментариях.