Статьи

Изображения водяных знаков на лету в статье PHP

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

Решение заключается в нанесении водяных знаков на изображения. Но стандартная процедура создания водяных знаков для редактирования изображения в приложении для редактирования фотографий отнимает много времени. PHP предлагает гораздо лучшее решение.

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

Сценарий

Сценарий длиной всего 13 строк начинается с вызова header() Без этой строки страница, вызывающая скрипт через <img>

Указывать тип содержимого в большинстве сценариев PHP не требуется, поскольку «text / html» является типом содержимого по умолчанию для сценариев PHP.

 header('content-type: image/jpeg');

Теперь, когда браузер готов к изображению, мы можем начать вычислять математику размещения водяных знаков и загрузить изображения.

Водяной знак

Файл с названием «watermark.png» (обратите внимание на использование формата PNG; в GD 2.0+ удалена совместимость с изображениями GIF) должен находиться в том же каталоге, что и скрипт. Если нет, измените путь к файлу в следующем вызове функции, который загрузит изображение водяного знака. Файл должен быть в формате PNG-8, а не PNG-24. В текущей версии GD есть ошибка, которая не поддерживает PNG-24 правильно.

 $watermark = imagecreatefrompng('watermark.png');

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

 $watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);
Изображение

Теперь мы создадим из файла JPEG изображение, которое мы хотим иметь водяным знаком, и установим его в качестве переменной $image Используя функцию imagecreatefromjpeg() Это дает нам возможность манипулировать и / или выводить изображение, используя наш скрипт.

 $image = imagecreatefromjpeg($_GET['src']);

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

Далее мы собираемся сделать некоторые измерения размеров для водяного знака на изображении. Эти вычисления размеров будут выполнены (без какой-либо другой причины, кроме как узнать о новых функциях) с использованием функции getimagesize()getimagesize()

Процедура следующих трех строк кода:

  1. возьмите размеры изображения, которое мы хотим, с водяным знаком, $ image
  2. вычесть соответствующее измерение из нашего водяного знака изображения
  3. добавить 5 пикселей поля

Наконец, нам нужно оставить точный пиксель (далее называемый «местом назначения»), в котором наше изображение водяного знака ( $watermark$image

 $size = getimagesize($_GET['src']);  
$dest_x = $size[0] - $watermark_width - 5;  
$dest_y = $size[1] - $watermark_height - 5;
Слияние изображения и водяного знака

Вот самая сложная функция во всем скрипте: imagecopymerge (). Официальный синтаксис этой функции:

 int imagecopymerge ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )

Этот отрывок из руководства объясняет эту функцию лучше, чем я когда-либо мог:

Скопируйте часть src_imdst_imsrc_xsrc_ysrc_wsrc_h Определенная часть будет скопирована в координаты x, y, dst_xdst_y Два изображения будут объединены в соответствии с pct, который может варьироваться от 0 до 100.

(Источник: руководство по PHP )

Короче говоря, следующая строка кода объединяет два изображения, используя места назначения, которые мы рассчитали ранее:

 imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);

Наши последние строчки кода выведут изображение, объединенное с водяным знаком, в браузер с помощью imagejpeg() Затем они будут использовать imagedestroy()

 imagejpeg($image);  
imagedestroy($image);  
imagedestroy($watermark);

Вот оно! Теперь вы можете динамически пометить любое изображение на вашем веб-сервере, используя одну из самых смертоносных комбинаций свободного программного обеспечения: PHP и библиотеку изображений GD. Полный скрипт с водяными знаками приведен ниже. Наслаждайтесь!

 <?php  

header('content-type: image/jpeg');  

$watermark = imagecreatefrompng('watermark.png');  
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);  
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($_GET['src']);  
$size = getimagesize($_GET['src']);  
$dest_x = $size[0] - $watermark_width - 5;  
$dest_y = $size[1] - $watermark_height - 5;  
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);  
imagejpeg($image);  
imagedestroy($image);  
imagedestroy($watermark);  

?>