В сети интернет присутствует большое количество изображений, которые, как правило, загружаются владельцами сайтов, либо пользователями сайта. В зависимости от актуальности изображение может мигрировать от сайта к сайту. Не говоря уже об авторском праве, не каждому владельцу сайта может понравиться тот факт, что изображения с его сайта копируют на других ресурсах. Как средство борьбы с банальным копированием изображений сайта было придумано накладывать водные знаки на изображения, с указанием принадлежности изображения к тому или иному ресурсу. Это может быть особо актуально для сайтов, у которых большое количество уникальных изображений.
Рассмотрим пример кода, который демонстрирует наложение водного знака, на загружаемые картинки.
Итак, основные настройки содержаться в виде констант, и идут в коде первыми:
// путь изображению водяного знака 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/');
На странице мы разместим форму загрузки изображения, с помощью которой изображения будут отправляться на сервер.
Код формы:
<form enctype="multipart/form-data" action="index.php" method="post"> Выберите файл изображения: <input name="userfile" type="file"> <input type="submit" value="Загрузить"> </form> <?if (isset($_FILES['userfile']['tmp_name']) && $_FILES['userfile']['tmp_name'] != ''){ $result = ImageUpload($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']); if ($result === false){ echo '<b>Загрузка не удалась!</b>'; } else {?> <div id="source_image"> <div class="title_image">Исходное изображение</div> <img src="<?=$result[0]?>" style="max-width: 300px;" /> </div> <div id="watermark_image"> <div class="title_image">Изображение с водяным знаком</div> <img src="<?=$result[1]?>" style="max-width: 300px;" /> </div> <?} }?>
Ну а теперь самое основное, это функции для обработки изображения. Разместить эти функции следует перед показом формы на странице.
<? // функция загрузки изображения 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); } ?>
Две ключевые функции, с помощью одной изображение загружается на сервер, с помощью другой накладывается водяной знак. Пожалуй, комментарии к функциям расписаны более чем подробно, и писать тоже самое здесь будет лишним.
А вот и архив с исходником примера. На этом пока всё, успехов!