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