Создание водяных знаков с помощью PHP. Добавление водяного знака на фото средствами PHP Выбор способа нанесения водяного знака

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

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

Затем формируем заголовок файла:

// это строка сообщит браузеру что мы передаём jpg изображение header("content-type: image/jpeg");

Затем мы формируем png изображение и получаем его размеры:

// создание водяного знака в формате png $watermark = imagecreatefrompng("watermark.png"); // получаем ширину и высоту $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark);

То же самое сделаем и с оригинальным изображением, но только в формате jpg. Это обычное дело для фоток, которые загружаются через форму. Действуем следующим образом:

// создание jpg изображения $image_path = "original.jpg"; $image = imagecreatefromjpeg($image_path); // получаем размерность изображения $size = getimagesize($image_path);

Теперь нам надо поместить водяной знак на изображение:

// помещаем водяной знак в нижней части справа. Делаем отступ в 5px $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5;

Затем настроим опции смешивания для обоих изображений:

Imagealphablending($image, true); imagealphablending($watermark, true);

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

// создаём новое изображение imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($image);

Важно убрать за собой:

// освобождаем память imagedestroy($image); imagedestroy($watermark);

Для регулирования прозрачности водяного знака можно использовать Photoshop.

С теорией всё. Теперь применим наши знания в реальном проекте. Всё это необходимо сохранить в файл. К примеру под названием watermark.php

Header("content-type: image/jpeg"); // получаем имя изображения через GET $image = $_GET["image"]; // создаём водяной знак $watermark = imagecreatefrompng("watermark.png"); // получаем значения высоты и ширины водяного знака $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); // создаём jpg из оригинального изображения $image_path = "/path/to/image/folder/" . $image; $image = imagecreatefromjpeg($image_path); //если что-то пойдёт не так if ($image === false) { return false; } $size = getimagesize($image_path); // помещаем водяной знак на изображение $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5; imagealphablending($image, true); imagealphablending($watermark, true); // создаём новое изображение imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($image); // освобождаем память imagedestroy($image); imagedestroy($watermark);

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

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

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

Затем формируем заголовок файла:

// это строка сообщит браузеру что мы передаём jpg изображение header("content-type: image/jpeg");

Затем мы формируем png изображение и получаем его размеры:

// создание водяного знака в формате png $watermark = imagecreatefrompng("watermark.png"); // получаем ширину и высоту $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark);

То же самое сделаем и с оригинальным изображением, но только в формате jpg. Это обычное дело для фоток, которые загружаются через форму. Действуем следующим образом:

// создание jpg изображения $image_path = "original.jpg"; $image = imagecreatefromjpeg($image_path); // получаем размерность изображения $size = getimagesize($image_path);

Теперь нам надо поместить водяной знак на изображение:

// помещаем водяной знак в нижней части справа. Делаем отступ в 5px $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5;

Затем настроим опции смешивания для обоих изображений:

Imagealphablending($image, true); imagealphablending($watermark, true);

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

// создаём новое изображение imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($image);

Важно убрать за собой:

// освобождаем память imagedestroy($image); imagedestroy($watermark);

Для регулирования прозрачности водяного знака можно использовать Photoshop.

С теорией всё. Теперь применим наши знания в реальном проекте. Всё это необходимо сохранить в файл. К примеру под названием watermark.php

Header("content-type: image/jpeg"); // получаем имя изображения через GET $image = $_GET["image"]; // создаём водяной знак $watermark = imagecreatefrompng("watermark.png"); // получаем значения высоты и ширины водяного знака $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); // создаём jpg из оригинального изображения $image_path = "/path/to/image/folder/" . $image; $image = imagecreatefromjpeg($image_path); //если что-то пойдёт не так if ($image === false) { return false; } $size = getimagesize($image_path); // помещаем водяной знак на изображение $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5; imagealphablending($image, true); imagealphablending($watermark, true); // создаём новое изображение imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($image); // освобождаем память imagedestroy($image); imagedestroy($watermark);

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

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

Рассмотрим пример кода, который демонстрирует наложение водного знака, на загружаемые картинки.

Итак, основные настройки содержаться в виде констант, и идут в коде первыми:

// путь изображению водяного знака define("WATERMARK_OVERLAY_IMAGE", "/lab/watermark/watermark.png"); // Сжатие, диапазон 0-100 (влияет на качетсво изображения) define("WATERMARK_OUTPUT_QUALITY", 100); // папка с исходными изображениями define("UPLOADED_IMAGE_DESTINATION", "/lab/watermark/upload/src/"); // папка с обработанными изображениями define("WATERMARK_IMAGE_DESTINATION", "/lab/watermark/upload/");

На странице мы разместим форму загрузки изображения, с помощью которой изображения будут отправляться на сервер.
Код формы:

Выберите файл изображения:
Исходное изображение
" style="max-width: 300px;" />
Изображение с водяным знаком
" style="max-width: 300px;" />

Ну а теперь самое основное, это функции для обработки изображения. Разместить эти функции следует перед показом формы на странице.

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

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

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

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

В интернете есть решение данной проблемы в виде двух файлов, содержимое которых приведено ниже.
Исходный код файла ".htaccess"

DirectoryIndex index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^(.*)$ /watermark/_watermark.php

Исходный код файла "_watermark.php"

250) && ($info_o > 250)) { // Для изображений без альфа-канала // Последний параметр функции - степень непрозрачности водяного знака imageCopyMerge($out, $watermark, ($info_o-$info_w)/2, ($info_o-$info_w)/2, 0, 0, $info_w, $info_w, 25); // Для изображений с альфа-каналом // В этом случае прозрачность регулируется альфа-каналом самого изображения // imageCopy($out, $watermark, ($info_o-$info_w)/2, ($info_o-$info_w)/2, 0, 0, $info_w, $info_w); } switch ($info_o) { case 1: imageGIF($out); break; case 2: imageJPEG($out); break; case 3: imagePNG($out); break; default: return false; } imageDestroy($out); imageDestroy($original); imageDestroy($watermark); return true; } ?>

Решение сводится к следующему, в каталог с файлами изображений помещается файл ".htaccess". Кроме него на сервере создается папка "watermark", в которой находится файл скрипта "_watermark.php" и собственно файл водяного знака "watermark.png".

При этом мною, по сравнению с оригинальной версией, встреченной в интернете, были внесены незначительные изменения в оба текстовых файла.

В файл ".htaccess", в регулярное выражение поиска файлов изображений добавлено расширение "jpeg", как тоже часто встречающееся.

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

Также следует обратить внимание на тот факт, что помещая папку "watermark" в папку с изображениями, как советуют оригинальные источники, мы не добьемся желаемого результата, т.к. в этом случае нам придется иметь в каждой папке свой собственный файл ".htaccess" и папку "watermark". Это связано с тем, что в файле ".htaccess" указываются абсолютные пути от корневого каталога сайта к файлу "_watermark.php". Таким образом, имея в каждой папке с изображениями отдельную подпапку "watermark", в случае необходимости изменить водяной знак (либо скрипт, накладывающий его на изображение), нам придется произвести изменения во всех папках.

Чтобы избежать этой проблемы, я рекомендую создавать папку "watermark" в корневом каталоге сайта, а в каталоги изображений помещать файл ".htaccess" без необходимости каждый раз его менять. В этом случае для изменения водяного знака или скрипта нам необходимо будет внести изменения лишь в одном месте сайта. Создавать разные водяные знаки для разных папок с изображениями в таком случае можно ссылаясь из разных файлов ".htaccess" на разные скрипты, например "_watermark-1.php", "_watermark-2.php" и т.д.

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

Скачать архив, содержащий все необходимые файлы можно по этой