Интернет был бы довольно скучным без изображений. Однако сохранение и управление сотнями или тысячами изображений для вашего веб-сайта может быть головной болью. При изменении дизайна вашего сайта вам может потребоваться изменить все изображения, например, вам может понадобиться преобразовать все изображения в оттенки серого или изменить их размер до 50% от их первоначального размера. Вы также можете сжать или обрезать различные изображения. Выполнение этого вручную занимает много времени и подвержено ошибкам, но с небольшими знаниями в области программирования это может быть автоматизировано.
В этом уроке вы узнаете о библиотеке GD (Graphic Draw) в PHP. Вы увидите, как эту библиотеку можно использовать для управления изображениями путем изменения их размера, обрезки, поворота или фильтрации.
Что такое БЖ?
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
, указывающими положение и размеры окна обрезки.
Изображение бабочки выше было обрезано с использованием следующего кода:
1
2
3
4
|
$im_php = imagecreatefromjpeg(‘path/to/image’);
$size = min(imagesx($im_php), imagesy($im_php));
$im_php = imagecrop($im_php, [‘x’ => $size*0.4, ‘y’ => 0, ‘width’ => $size, ‘height’ => $size]);
$im_php = imagescale($im_php, 300);
|
По сути, мы храним длину наименьшей стороны в переменной $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_NEGATE
цвета в изображении -
IMG_FILTER_GRAYSCALE
: удаляет цвет с изображения -
IMG_FILTER_BRIGHTNESS
: делает изображение ярче или темнее -
IMG_FILTER_CONTRAST
: увеличивает контраст изображения -
IMG_FILTER_COLORIZE
: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
принимает четыре параметра, которые определяют значения для красного, зеленого и синего компонентов, а также альфа-канала.
Изображение в верхнем левом углу является оригиналом. Верхнее правое изображение было создано с COLORIZE
фильтра COLORIZE
, нижнее левое изображение было создано с GRAYSCALE
фильтра GRAYSCALE
, а изображение в правом нижнем углу было создано с помощью фильтра BRIGHTNESS
. (Это изображение бабочки было найдено в Pixabay .)
Другие полезные функции управления изображениями
Вы также должны знать о некоторых других общих функциях GD, которые время от времени пригодятся.
Получить размеры изображения
Вы можете определить ширину и высоту ресурса изображения, используя функции imagesx()
и imagesy()
.
Другая функция, называемая getimagesize()
также может использоваться для получения ширины и высоты изображения вместе с его типом. Эта функция возвращает массив с элементами, определяющими ширину, высоту и формат изображения. Первые два элемента массива описывают ширину и высоту, а третий элемент содержит константу, определяющую формат файла: один из IMAGETYPE_PNG
, IMAGETYPE_GIF
и т. Д.
Сохранение изображения
После того, как вы внесли все необходимые изменения в изображение, вы, скорее всего, захотите либо вывести его в браузер, либо сохранить его в виде файла. В любом случае вам придется использовать одну из функций вывода GD, например, imagejpeg()
, imagepng()
или imagegif()
. Вы передадите свой ресурс изображения одной из этих функций вывода и, если вы хотите сохранить изображение в файл, вы также укажите имя файла. Вы также можете контролировать качество выходного изображения, используя третий необязательный параметр в зависимости от типа изображения.
Изменение размера всех изображений в каталоге
Давайте применять знания, которые мы получили до сих пор, чтобы сделать что-то практическое. В этом разделе мы изменим размеры всех изображений JPEG в определенном каталоге, чтобы иметь ширину 640 пикселей. Высота будет рассчитана автоматически на основе размеров исходного изображения.
Мы будем сохранять измененные изображения в новой папке под названием Resized . Все исходные изображения в этом случае имеют одинаковые размеры, но код будет правильно работать с изображениями, которые имеют разные размеры и пропорции.
01
02
03
04
05
06
07
08
09
10
|
$directory = ‘Nature/’;
$images = glob($directory.»*.jpg»);
foreach($images as $image) {
$im_php = imagecreatefromjpeg($image);
$im_php = imagescale($im_php, 640);
$new_height = imagesy($im_php);
$new_name = str_replace(‘-1920×1080’, ‘-640x’.$new_height, basename($image));
imagejpeg($im_php, $directory.’Resized/’.$new_name);
}
|
В приведенном выше коде мы начинаем с использования функции glob()
чтобы найти все изображения с расширением .jpg в каталоге с названием Nature . Файлы изображений хранятся в массиве, и мы перебираем их один за другим.
Поскольку все изображения, которые мы хотим изменить, являются файлами JPEG, мы используем функцию imagecreatefromjpeg()
для загрузки их в скрипт. Затем imagescale()
используется для изменения размера изображения до определенной ширины — в нашем случае 640 пикселей. Мы не указали фиксированную высоту, поэтому высота будет рассчитана автоматически.
Каждый из файлов исходного изображения был добавлен -1920×1080 к имени файла, чтобы указать его размеры. Мы используем str_replace()
для исходного имени файла и заменяем -1920X1080 на новый размер изображения.
Наконец, мы сохраняем измененные изображения в папке с именем Resized с новыми именами файлов. Вы также можете передать третий параметр в функцию imagejpeg()
чтобы установить качество сохраненного файла изображения. Если третий параметр пропущен, изображения сохраняются с качеством по умолчанию 75.
Применяйте фильтры градаций серого и контрастности к каждому изображению в каталоге
На этот раз мы будем применять два разных фильтра к каждому изображению в нашем каталоге и сохранять конечный результат в другом каталоге без внесения каких-либо изменений в имя файла. Давайте углубимся в код, а позже я объясню, что делает каждая функция.
01
02
03
04
05
06
07
08
09
10
|
$directory = ‘Nature/’;
$images = glob($directory.»*.jpg»);
foreach($images as $image) {
$im_php = imagecreatefromjpeg($image);
imagefilter($im_php, IMG_FILTER_GRAYSCALE);
imagefilter($im_php, IMG_FILTER_CONTRAST, -25);
$new_name = basename($image);
imagejpeg($im_php, $directory.’Grayscale/’.$new_name);
}
|
Как видите, мы загружаем изображения из каталога Nature точно так же, как и в предыдущем примере. Однако на этот раз мы будем использовать imagefilter()
чтобы применить фильтры к загруженному ресурсу изображения.
Обратите внимание, что imagefilter()
изменяет исходное изображение и возвращает TRUE
или FALSE
зависимости от успеха или неудачи операции. Это отличается от функции imagescale()
мы использовали в предыдущем разделе, которая возвращала ресурс масштабированного изображения.
Еще одна важная вещь, которую нужно иметь в виду, это то, что контрастный фильтр принимает значения от -100 до 100. Отрицательные значения подразумевают большую контрастность, а положительные значения означают меньшую контрастность. Это противоположно тому, что некоторые люди могут ожидать! Значение 0 оставит изображение без изменений.
Фильтр яркости, с другой стороны, имеет минимальные и максимальные пределы -255 и 255. Отрицательное значение в этом случае подразумевает минимальную яркость, а положительное значение подразумевает максимальную яркость.
Мы получаем имя файла из пути к файлу с помощью функции basename()
а затем сохраняем изображение с помощью функции imagejpeg()
.
Последние мысли
Целью данного руководства было познакомить вас с библиотекой GD на PHP и показать, как использовать все эти функции для облегчения вашей жизни. Вы можете использовать примеры в конце руководства в качестве руководства для написания собственных сценариев манипулирования изображениями. Например, вы можете изменить размер изображения, только если оно шире указанного предела, определив его ширину с помощью функции imagesx()
.
Все эти функции открывают много возможностей, чтобы упростить манипуляции с изображениями и сэкономить много времени. Если у вас есть какие-либо вопросы, связанные с этим учебником, пожалуйста, дайте мне знать в комментариях.