В сети интернет присутствует большое количество изображений, которые, как правило, загружаются владельцами сайтов, либо пользователями сайта. В зависимости от актуальности изображение может мигрировать от сайта к сайту. Не говоря уже об авторском праве, не каждому владельцу сайта может понравиться тот факт, что изображения с его сайта копируют на других ресурсах. Как средство борьбы с банальным копированием изображений сайта было придумано накладывать водные знаки на изображения, с указанием принадлежности изображения к тому или иному ресурсу. Это может быть особо актуально для сайтов, у которых большое количество уникальных изображений.
Рассмотрим пример кода, который демонстрирует наложение водного знака, на загружаемые картинки.
Итак, основные настройки содержаться в виде констант, и идут в коде первыми:
// путь изображению водяного знака
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);
}
?>
Две ключевые функции, с помощью одной изображение загружается на сервер, с помощью другой накладывается водяной знак. Пожалуй, комментарии к функциям расписаны более чем подробно, и писать тоже самое здесь будет лишним.
А вот и архив с исходником примера. На этом пока всё, успехов!