Скрипт наложения водяного знака на изображение
Когда на сайте уникальный контент, обозначение авторства скорее необходимость чем прихоть. И если для текста есть несколько вариантов сохранения уникальности, то для картинки основной и возможно самый действенный способ - это нанесение водяного знака (т.к. его очень сложно убрать даже с помощью фоторедакторов). Поэтому в сегодняшней статье я решил выложить скрипт наложения водяного знака на изображение.
В PHP для работы графических функций необходима библиотека GD. Без нее скрипт работать не будет. Поэтому, если ее нет, устанавливаем. Установку описывать не буду, поскольку для разных дистрибутивов свои команды. Ну а чтобы проверить установку можно использовать функцию extension_loaded('gd').
После того как все зависимости установлены давайте посмотрим на код скрипта:
class Watermark
{
/**
* Наносит водяной знак на изображение.
*
* @param string $imagePath Путь к файлу изображения.
* @param string $watermarkPath Путь к файлу водяного знака.
* @param boolean $center Центрирование водяного знака.
* @param integer $offsetX x-координата водяного знака. Если $center = true игнорируется.
* @param integer $offsetY y-координата водяного знака. Если $center = true игнорируется.
*/
static public function set($imagePath, $watermarkPath, $center = false, $offsetX = 0, $offsetY = 0)
{
// Создаем изображение
if (null === $image = self::createImage($imagePath))
throw new Exception('Некорректный тип изображения.');
// Создаем изображение водяного знака
if (null === $watermarkImage = self::createImage($watermarkPath))
throw new Exception('Некорректный тип водяного знака.');
// Получаем размеры изображения
$xImage = imagesx($image);
$yImage = imagesy($image);
// Получаем размеры водяного знака
$xWatermarkImage = imagesx($watermarkImage);
$yWatermarkImage = imagesy($watermarkImage);
// Вычисляем координаты для водяного знака
if ($center)
{
// Центрируем водяной знак
$offsetX = ($xImage / 2) - ($xWatermarkImage / 2);
$offsetY = ($yImage / 2) - ($yWatermarkImage / 2);
}
$xDest = $xImage - ($xWatermarkImage + $offsetX);
$yDest = $yImage - ($yWatermarkImage + $offsetY);
// Задаем режим сопряжения цветов для изображений (прозрачность)
imagealphablending($image, true);
imagealphablending($watermarkImage, true);
// Копируем водяной знак на изображение
imagecopyresampled($image, $watermarkImage, $xDest, $yDest, 0, 0, $xWatermarkImage, $yWatermarkImage, $xWatermarkImage, $yWatermarkImage);
// Сохраняем изображение
$pathInfo = pathinfo($imagePath);
$filetype = $pathInfo['extension'];
switch ($filetype)
{
case 'jpg':
imagejpeg($image, $imagePath, 100);
break;
case 'jpeg':
imagejpeg($image, $imagePath, 100);
break;
case 'gif':
imagegif($image, $imagePath);
break;
case 'png':
imagepng($image, $imagePath);
break;
}
// Освобождаем память, занятую изображениями
imagedestroy($watermarkImage);
imagedestroy($image);
}
/**
* Создает изображение.
*
* @param text $imagePath Путь к картинке.
* @return Resource|null
*/
static private function createImage($imagePath)
{
$image = null;
switch (getimagesize($imagePath)[2])
{
case 1:
$image = imagecreatefromgif($imagePath);
break;
case 2:
$image = imagecreatefromjpeg($imagePath);
break;
case 3:
$image = imagecreatefrompng($imagePath);
break;
}
return $image;
}
}
Ну и сам вызов:
$imagePath = __DIR__ . '/image.jpg'; // путь к картинке
$watermarkPath = __DIR__ . '/watermark.png'; // путь к водяному знаку
Watermark::set($imagePath, $watermarkPath);
Как видно из кода выше обязательных параметров всего два - это путь к картинке и путь к водяному знаку. Третьим параметром, для более удобной настройки, я сделал возможность центрирования водяного знака. А уже после идут координаты по х и y осям. Стоит заметить, что при включенном третьем параметре, значения координат будет игнорироваться.
Таким образом, используя данный скрипт, можно защитить свои авторские права на загружаемые картинки. И не бояться их копирования, поскольку оригинальный источник всегда будет наглядно виден на картинке.