Когда на сайте уникальный контент, обозначение авторства скорее необходимость чем прихоть. И если для текста есть несколько вариантов сохранения уникальности, то для картинки основной и возможно самый действенный способ - это нанесение водяного знака (т.к. его очень сложно убрать даже с помощью фоторедакторов). Поэтому в сегодняшней статье я решил выложить скрипт наложения водяного знака на изображение.

В 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 осям. Стоит заметить, что при включенном третьем параметре, значения координат будет игнорироваться.

Таким образом, используя данный скрипт, можно защитить свои авторские права на загружаемые картинки. И не бояться их копирования, поскольку оригинальный источник всегда будет наглядно виден на картинке.