Давайте предположим, что вы только что получили пять скриншотов из самой большой видеоигры года. Вы хотите поделиться своими скриншотами, но нужно отдать должное, когда это необходимо — в конце концов, вы не были любезными представителями по связям с общественностью ради забавы, верно?
Решение заключается в нанесении водяных знаков на изображения. Но стандартная процедура создания водяных знаков для редактирования изображения в приложении для редактирования фотографий отнимает много времени. 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()
Процедура следующих трех строк кода:
- возьмите размеры изображения, которое мы хотим, с водяным знаком, $ image
- вычесть соответствующее измерение из нашего водяного знака изображения
- добавить 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_im
dst_im
src_x
src_y
src_w
src_h
Определенная часть будет скопирована в координаты x, y,
dst_x
dst_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);
?>