Создание водяных знаков с помощью 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/");
На странице мы разместим форму загрузки изображения, с помощью которой изображения будут отправляться на сервер.
Код формы:
Ну а теперь самое основное, это функции для обработки изображения. Разместить эти функции следует перед показом формы на странице.
// функция загрузки изображения function ImageUpload($temp_path, $temp_name){ // получаем параметры изображения list($temp_width, $temp_height, $temp_type) = getimagesize($temp_path); // если тип определить не получилось, то возвращаем FALSE if ($temp_type === NULL) return false; // если тип загружаемого файла не GIF, JPEG, PNG switch ($temp_type){ case 1: break; case 2: break; case 3: break; default: return false; } // пути для сохранения $upload_image_path = UPLOADED_IMAGE_DESTINATION . $temp_name; $watermark_image_path = WATERMARK_IMAGE_DESTINATION . preg_replace("/\\.[^\\.]+$/", ".jpg", $temp_name); // загружаем исходное изображение move_uploaded_file($temp_path, $_SERVER["DOCUMENT_ROOT"].$upload_image_path); // создаем копию изображения и добавляем водяной знак $result = AddWaterMark($_SERVER["DOCUMENT_ROOT"].$upload_image_path, $_SERVER["DOCUMENT_ROOT"].$watermark_image_path); // возвращаем путь к файлу return ($result === false ? false: array($upload_image_path, $watermark_image_path)); } // функция добавления водяного знака function AddWaterMark($source_image_path, $result_image_path){ // получаем размеры и тип исходного изображения list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path); // останавливаем выполнение если не удалось определить тип if ($source_image_type === NULL) return false; // создаем ресурс изображения из исходной картинки switch ($source_image_type) { case 1: // картинка *.gif $source_image = imagecreatefromgif($source_image_path); break; case 2: // картинка *.jpeg, *.jpg $source_image = imagecreatefromjpeg($source_image_path); break; case 3: // картинка *.png $source_image = imagecreatefrompng($source_image_path); break; default: return false; // в ином случае не делаем ничего } // создаем ресурс изображения для нашего водяного знака $watermark_image = imagecreatefrompng($_SERVER["DOCUMENT_ROOT"].WATERMARK_OVERLAY_IMAGE); // получаем размеры $watermark_width = imagesx($watermark_image); $watermark_height = imagesy($watermark_image); // параметры наложения с прозрачным фоном imagealphablending($source_image, true); imagesavealpha($source_image, true); // копирование и наложение знака на исходное изображение imagecopy($source_image, $watermark_image, $source_image_width - $watermark_width, $source_image_height - $watermark_height, 0, 0, $watermark_width, $watermark_height); // сохранение результата imagejpeg($source_image, $result_image_path, WATERMARK_OUTPUT_QUALITY); // очистка всех временных ресурсов imagedestroy($source_image); imagedestroy($watermark_image); } ?>
Две ключевые функции, с помощью одной изображение загружается на сервер, с помощью другой накладывается водяной знак. Пожалуй, комментарии к функциям расписаны более чем подробно, и писать тоже самое здесь будет лишним.
Владельцы сайтов (форумов, досок объявлений и т.д.) часто сталкиваются с проблемой создания водяных знаков на всех крупных изображениях сайта.
Конечно, решить эту проблему можно создавая водяной знак вручную на каждом изображении, однако, во-первых, это занимает много времени, во-вторых, возникает необходимость хранить две версии изображения, с водяным знаком и без него.
Решением данной проблемы может служить динамическое наложения водяного знака на изображение перед передачей его посетителю сайта.
В интернете есть решение данной проблемы в виде двух файлов, содержимое которых приведено ниже.
Исходный код файла ".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" помещать в те каталоги сайта, изображения из которых должны помечаться водяным знаком.
Скачать архив, содержащий все необходимые файлы можно по этой