Resize изображения и наложение водяного знака 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);
Теперь для того, чтобы показать фотку на которой будет водяной знак не изменяя исходное изображение, используйте следующий код.
В сети интернет присутствует большое количество изображений, которые, как правило, загружаются владельцами сайтов, либо пользователями сайта. В зависимости от актуальности изображение может мигрировать от сайта к сайту. Не говоря уже об авторском праве, не каждому владельцу сайта может понравиться тот факт, что изображения с его сайта копируют на других ресурсах. Как средство борьбы с банальным копированием изображений сайта было придумано накладывать водные знаки на изображения, с указанием принадлежности изображения к тому или иному ресурсу. Это может быть особо актуально для сайтов, у которых большое количество уникальных изображений.
Рассмотрим пример кода, который демонстрирует наложение водного знака, на загружаемые картинки.
Итак, основные настройки содержаться в виде констант, и идут в коде первыми:
// путь изображению водяного знака 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); } ?>
Две ключевые функции, с помощью одной изображение загружается на сервер, с помощью другой накладывается водяной знак. Пожалуй, комментарии к функциям расписаны более чем подробно, и писать тоже самое здесь будет лишним.
Если вы хотите добавить водяной знак на фото, не заморачиваясь с графическими редакторами или добавлять его во время загрузки фоток на сервер, то это урок для вас.
В этом уроке я покажу вам как добавить водяной знак на изображение на лету, фактически не изменяя исходное изображение. В первую очередь, вам понадобится изображение, которое вы будете использовать в качестве водяного знака.
Затем формируем заголовок файла:
// это строка сообщит браузеру что мы передаём 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);
Теперь для того, чтобы показать фотку на которой будет водяной знак не изменяя исходное изображение, используйте следующий код.
Вы сильно рискуете, когда публикуете свои изображения и видео в интернете, так как Ваши материалы с легкостью могут быть скопированы на сотни других ресурсов. Не очень здорово будет обнаружить Вашу картинку к новости, например, над которой Вы усиленно трудились, на другом сайте без указания источника, то есть Вашего сайта, не правда ли? Вы, мягко говоря, расстроитесь, а если это была не простая картинка к новости, а сложная работа в фотошопе, сказать, что Вы будите в гневе – ничего не сказать! Так, что же можно предпринять, чтобы защитить свои графические материалы?
Для защиты авторских прав на изображения или видео в интернете используется, как правило, цифровой водяной знак или ЦВЗ для удобства. Прикрепляйте ЦВЗ на каждое загружаемое изображение, для того, чтобы обезопасить его. ЦВЗ может быть логотипом Вашего сайта или компании, красиво и эстетично размещенный на загружаемых изображениях.
Создадим, вначале, файл содержащий необходимые настройки в виде констант – /config.php :
Define("WATERMARK_OVERLAY_IMAGE", "/develop/images/watermark.png"); // Путь до Вашего ЦВЗ define("WATERMARK_OUTPUT_QUALITY", 100); // Качество получаемого изображения с ЦВЗ. Помните, что качество напрямую влияет на размер файла. define("UPLOADED_IMAGE_DESTINATION", "/develop/folder1/"); // Путь к расположению исходных загружаемых изображений define("WATERMARK_IMAGE_DESTINATION", "/develop/folder2/"); // Путь к изображениям с наложенным ЦВЗ
/*Функция добавления водяного знака на исходное изображение*/ 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); } /*Функция загрузки изображения*/ 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); // В случае, если все прошло упешно, возвращаем путь к файлу с ЦВЗ if ($result === false) { return false; } else { return array($upload_image_path, $watermark_image_path); } } ?>
Соберем созданные выше файлы в исполняющем загрузку файле /upload.php
Include ("config.php"); include ("functions.php"); $result = ImageUpload($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"]); if ($result === false){ echo "Загрузка не удалась!"; }
Для примера если загружаемое изображение было:
То после загрузки и наложения водяного знака, получиться следующее изображение:
В данном примере загружаемое изображение сохраняется в одну папку, а изображение, на которое был наложен цифровой водяной знак в другую, чтобы Вы всегда имели доступ к оригинальным изображениям, но на сайте, разумеется, стоит размещать изображения с ЦВЗ.
(178,4 KiB, 989 hits)