GD в PHP
PHP имеет возможность манипулировать изображениями, создавать свои собственные изображения с нуля, а затем либо сохранять, либо отдать пользователям. GD
используются для создания и управления файлами изображений в различных форматах:
GIF
PNG
JPEG
WBMP
XBM
XPM
GD
GD2
GD
входит в состав PHP начиная с PHP версии 4.3. Вы можете запустить phpinfo()
, чтобы проверить установлен ли GD
, на приведенном ниже экране показано, что GD
установлен:
Импорт и экспорт изображений
Чтобы начать работать с изображением, его нужно импортировать в собственный формат библиотеки GD
. После завершения всех операций изображение можно экспортировать в какой-либо стандартный графический формат.
Импорт
Средствами PHP можно импортировать изображения откуда угодно - из файлов, базы данных, интернета.
Формально, для импорта из файлов и из интернета должен применяться целый набор функций, имеющих однотипные названия, где тип_расширения_файла
указывает на формат изображения PNG
, GIF
, JPEG
, WBMP
, XBM
, XPM
, GD
, GD2
:
imagecreatefrom<тип_расширения_файла>
На практике я рекомендую применять связку из функций file_get_contents()
+ imagecreatefromstring()
. Это избавляет от необходимости привязывать код к типам графических ресурсов - если в дальнейшем вам понадобится работать с JPEG
вместо PNG
, не нужно будет везде в коде менять названия применяемых фукций.
После выполнения скрипта в $image
будет ссылка на ресурс - изображение во внутреннем формате GD
:
$file = file_get_contents("test.png");
$image = imagecreatefromstring($file);
У данного способа есть и недостаток: если вам критичен пиковый объем памяти, потребляемый скриптом - используйте все-таки функции imagecreatefrom<тип_расширения_файла>()
, а лучше переложите работу с изображениями на плечи специализированных пакетов типа ImageMagic.
Импорт из базы данных отличается тем, что строку для imagecreatefromstring()
нужно получить не из файла, а из поля в базе данных.
Импорт из интернета может производиться при помощи fopen wrapper
или при помощи CURL
. Второй способ я здесь не рассматриваю, он заслуживает отдельного описания.
Чтобы иметь возможность пользоваться fopen wrapper
, в php.ini
должна быть установлена опция allow_url_fopen = true
. В этом случае функции file_get_contents
в качестве параметра можно передавать не только имя файла на локальном диске, но и URL ссылающийся на ресурс в интернете. Это может быть URL картинки на сайте, или ссылка на FTP.
$file = file_get_contents("https://hmarketing.ru/test.png");
$image = imagecreatefromstring($file);
Экспорт
Три типичных задачи экспорта - вывод изображения в браузер, экспорт в БД, экспорт в файл.
Для экспорта нужно определиться с типом изображения, которое должно получиться при конвертации из внутреннего формата GD
. Библиотека поддерживает форматы JPEG
, GIF
, PNG
, WBMP
и свои собственные GD
и GD2
. На вебе нас интересуют только первые три формата.
Чтобы вывести изображение в браузер или в файл, следует вызвать одну из функций imagejpeg()
, imagegif()
, imagepng()
. В качестве параметра им следует передать переменную, ссылающуюся на ресурс-изображение. Второй параметр у всех функций представляет собой имя файла, в который требуется сохранить результат конвертации. Если имя файла на задано, все функции выдают изображение в выходной буфер:
imagegif($image, $filename);
Чтобы изображение правильно отобразилось в браузере, вместе с ним должны быть отправлены корректные HTTP-заголовки:
header('Content-type: image/jpeg');
imagejpeg($image);
Чтобы экспортировать изображение в строку для базы данных, нужно воспользоваться механизмом буферизации вывода:
ob_start();
imagejpeg($image);
$raw = ob_get_clean();
Корректный экспорт полупрозрачных PNG
Один из двух внутренних форматов библиотеки GD
- позволяет задавать различную степень прозрачности для каждой точки
изображения, от полной прозрачности до полной непрозрачности, с шагом 1/256.
Степень прозрачности для каждой точки задается отдельно и никак не связана с цветом этой точки. Говорят, что у информации о каждой точке изображения есть два "канала" - цветовой канал, который задает цвет точки и "альфа-канал" - который задает ее степень прозрачности.
По умолчанию, при экспорте изображений из внутреннего формата GD
учитывается только цветовой канал. Для изображений типа GIF
или JPEG
этого достаточно, потому что эти форматы не поддерживают полупрозрачность (GIF
поддерживает полную прозрачность, но она устроена иначе - присвоением прозрачным точкам специального цвета, объявленного в палитре как прозрачный).
Формат PNG
поддерживает полноценнный альфа-канал, полупрозрачные изображения можно выводить в этом формате. Чтобы при экспорте в PNG
не была потеряна информация об альфа-канале, нужно добавить перед самим экспортом два вызова специальных функций:
ob_start();
imagealphablending($image, false);
imagesavealpha($image, true);
imagepng($image);
$raw = ob_get_clean();