Статьи

Управление изображениями в PHP с помощью GD

Интернет был бы довольно скучным без изображений. Однако сохранение и управление сотнями или тысячами изображений для вашего веб-сайта может быть головной болью. При изменении дизайна вашего сайта вам может потребоваться изменить все изображения, например, вам может понадобиться преобразовать все изображения в оттенки серого или изменить их размер до 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 XAMPP 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 , указывающими положение и размеры окна обрезки.

Обрезка и поворот изображений с помощью PHP

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

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() .

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