Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Изменение размера и манипулирование изображениями в PHP (с примерами)

by
Difficulty:IntermediateLength:MediumLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

В предыдущем уроке мы обсудили основные манипуляции с изображениями с помощью библиотеки PHP GD. В этом уроке я дал краткое введение в библиотеку и показал вам, как загружать изображения из файла или создавать их с нуля в PHP. После этого мы научились кадрировать, вращать, масштабировать и переворачивать изображение с помощью GD. Я применил функцию imagefilter(), чтобы применить различные фильтры к ресурсам изображений, загруженным в сценарий. Я также упомянул о некоторых полезных функциях в GD, таких как imagesx() и imagesy(), чтобы получить ширину и высоту загруженного изображения.

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

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

Манипулирование изображениями с использованием матрицы свертки

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

Легкий способ указать такой фильтр - это так называемая «матрица свертки». GD предоставляет функцию imageconvolution($image, $matrix, $div, $offset) для применения матрицы свертки 3x3 к изображению ресурса $image.

Параметр $matrix представляет собой массив из трех массивов, каждый из которых содержит три значения с плавающей точкой - то есть это матрица 3х3. Первый элемент первого массива умножается на значение цвета верхнего левого пикселя. Аналогично, второй элемент первого массива умножается на значение цвета пикселя непосредственно поверх центрального пикселя. Конечный цвет пикселя получается путем добавления результата всех этих умножений, а затем деления его на $div для нормализации. Обычно нормализация сохраняет окончательное значение цвета ниже 255.

Как мы видели, параметр $div используется как делитель для результата свертки для нормализации его значения. С другой стороны, параметр $offset используется для указания значения смещения для всех цветов. Вы увидите, как это влияет на конечный результат в приведенных ниже примерах.

Примеры свертки

Вот список некоторых различных матриц свертки, которые мы применили к изображению чашки на столе.

Размытие Blur

Размытие Blur работает, просто усредняя каждый пиксель со своими соседями. Мы устанавливаем значение делителя на 9, потому что сумма всех элементов в трех массивах равна 9.

Резкость Sharpen

Sharpen работает, преувеличивая различия между каждым пикселем и его соседями. Это делает края немного яснее. В случае резкости делитель равен 1, так как сумма всех элементов в трех массивах равна 1.

Тиснение Emboss

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

Обнаружение краев

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

При обнаружении края сумма всех элементов массива равна 0. Это означает, что изображение, которое мы получим, будет в основном черным, если не произойдет резкого изменения цвета, что обычно происходит на краях объектов. В основном черное изображение может быть повернуто на белый, установив параметр смещения на 255.

На следующем рисунке показан результат всех этих сверточных матриц.

Convolution Matrix

Функции копирования изображений

PHP GD имеет множество функций для копирования части изображения, а затем изменения размера или слияния. При использовании этих функций важно помнить, что PHP рассматривает верхний левый угол ресурса изображения как его источник. Положительное значение x приведет вас вправо от изображения, а положительное значение y приведет вас к дальнейшему снижению.

Простейшей из этих функций является imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h). Она скопирует исходное изображение на изображение назначения. Параметры $dst_x и $dst_y определяют верхний левый угол, в который будет вставлено скопированное изображение. Параметры $src_x, $src_y, $src_w и $src_h определяют прямоугольную часть исходного изображения, которая будет скопирована в пункт назначения.

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

Одним из решений этой проблемы является использование функций imagecopyresized($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h). Он принимает все параметры imagecopy() и два дополнительных параметра для определения размера области назначения, в которой будет скопировано исходное изображение.

Функция imagecopyresized() не идеальна, так как она масштабирует изображение вверх и вниз не очень хорошо. Однако, вы можете получить более качественное изменение размера с помощью функции imagecopyresampled(), которая принимает все те же параметры.

Копирование с прозрачностью

Есть еще две функции, связанные с копированием изображений, которые вы найдете очень полезными: imagecopymerge() и imagecopymergegray().

Функция imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) похожа на imagecopy(), где дополнительный параметр $pct определяет прозрачность скопированного образ. Значение 0 означает отсутствие прозрачности, а значение 100 означает полную прозрачность. Это будет очень полезно, если вы не хотите полностью скрывать содержимое основного изображения за вашим водяным знаком.

С другой стороны, функция imagecopymergegray() использует последний параметр для преобразования исходного изображения в оттенки серого. Если он установлен в 0, исходное изображение потеряет весь его цвет. Если установлено значение 100, исходное изображение останется неизменным.

Пример копирования изображения

Следующий пример использует функцию imagecopy(), чтобы превратить правую половину изображения в негатив. Мы уже обсуждали другие функции, такие как imagefilter() и imagescale(), используемые в этом фрагменте кода в предыдущем уроке.

Здесь мы создаем две копии исходного изображения, каждая из которых была уменьшена до ширины 800 пикселей. После этого мы используем функцию imagefilter() для создания негатива ресурса изображения $img_php_inv. Правая половина этого негатива затем копируется на исходное изображение с помощью функции imagecopy().

Это было очень простое использование функции imagecopy(). Вы можете увидеть результаты ниже. Вы также можете разделить изображение на более мелкие секции или полосы, чтобы создавать более интересные эффекты изображения. Мы будем использовать функцию imagecopymergegray() в фрагменте кода ниже, чтобы создать намного больше полос в исходном изображении рыбы.

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

На следующем рисунке показан конечный результат этих двух функций в сочетании с различными фильтрами изображений.

PHP GD Fish Mosaic

Добавление водяных знаков или другой информации в изображениях

Некоторые организации добавляют водяные знаки к своим изображениям, чтобы было ясно, что они имеют изображение. Это также увеличивает узнаваемость бренда и отговаривает других людей от грубого копирования изображений. Благодаря PHP GD, водяные знаки - это простая задача.

В приведенном выше фрагменте кода мы создали два разных ресурса изображения, используя imagecreatefromjpeg() для основного изображения и imagecreatefrompng() для водяного знака, соответственно. Мы определяем ширину и высоту основного изображения с помощью функций imagesx() и imagesy().

Не все изображения, которые вы хотите использовать для водяных знаков, будут иметь одинаковые размеры. Если вы не измените размер водяного знака на основе размеров основного изображения, это может показаться странным. Например, водяной знак 200px может выглядеть хорошо на 1000px-изображении, но он будет слишком большим для изображения шириной 600 пикселей, и он может выглядеть слишком маленьким на изображении шириной 2400 пикселей.

Поэтому мы используем функцию imagescale(), чтобы сохранить водяной знак на одной пятой от первоначальной ширины изображения. Затем мы используем функцию imagecopy(), чтобы поместить водяной знак в нужное место. Вот окончательный результат приведенного выше фрагмента кода.

Add Watermark to Images using GD

Помимо водяных знаков, вы также можете добавить другую информацию, такую как место, где была сделана фотография, или время, когда была сделана фотография.

Заключительные мысли

После изучения основ манипуляции с изображениями в нашем предыдущем учебнике мы узнали о нескольких других полезных функциях в библиотеке GD. В первой части учебника обсуждалось, как мы можем манипулировать изображениями на PHP с использованием матрицы свертки. Я также показал некоторые примеры операции матрицы свертки, которые помогут вам понять, как PHP достигает значений цвета разных пикселей.

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

Попробуйте использовать все эти функции для создания интересных эффектов изображения!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.