О web-разработке
и даже немного больше...

PHP: Наложение водяного знака

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

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

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

// путь изображению водяного знака
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);
}
?>

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

А вот и архив с исходником примера. На этом пока всё, успехов!

Опубликован: 22.08.2015 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Генерация QR-кода в PHP
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Создание PDF файлов в PHP

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта