Добавляем водяной знак к изображению при помощи PHP

2015, 17 августа

Для начало нам нужно создать изображения с водяным знаком, мне проше все это сделать в Photoshop’e. Добавляет дополнительный слой, а основной удаляем и получается прозрачный фон и на него добавим на водяной знак:
Создаем Полученное изображения сохраняем в формате png Теперь создадим изображения для миниатюр Создаем И так же сохраним его, у нас получилось 2 файла Основной Теперь начинаем писать код для нашего скрипта, для начало создадим файл с настройками config.php с таким исходным кодом:

define('system_slash','');  
  //Файлы, которые ищем в директория, расширения через запятую  
  define('image_mask', '.jpg,.png');
/*  
  *  Размеры миниатюр, не более этого  
  */  
  define('img_min_width', 200);  
  define('img_min_height', 150);
//Путь к водяному знаку для миниатюр  
  define('image_min_water', 'D:mytkaniwatermarkmin.png');  
  //Путь к водяному знаку  
  define('image_water', 'D:mytkaniwatermarkmax.png');
?>

Теперь напишем класс, который будет искать нужные нам файл в директории и поддиректориях, создаем файл class_directory_list.php и пишем код:

file_mask = explode(',', image_mask);
            while (FALSE !== ($file = readdir($handle))) {
                //Поиск поддерикторий
                if($subdir) {
                    if(is_dir($dir.system_slash.$file)) {
                        if(($file != '.')&&($file!='..')) {
                            //Рекурсивно погружаем поддиректории
                            $sdir = new DirectoryList($dir.system_slash.$file,true);
                            $this->concateFileList($sdir->getFileList());
                        }
                    }
                }
                if($this->isFileImage($file)) {
                    $this->file_list[] = $dir.system_slash.$file;
                }
            }

        } else {
            new Exception(Не удалось открыть директорию $dir);
        }
    }

    /**
     * Проверяет соответствует ли файл указанной маске
     * @param string $file Имя файла
     */
    private function isFileImage($file){
        foreach( $this->file_mask as $mask) {
            if( substr(strtolower($file), (strlen($mask)*-1))==$mask)
                    return true;
        }
        return false;
    }

    /**
     * Возращает массив файлов
     * @return array - Имя файлов
     */
    public function getFileList() {
        return $this->file_list;
    }

    /**
     * Объеденяет два листа в один основной
     * @param array $new_list - Указатель на массив с файлами
     */
    private function concateFileList(&$new_list) {
        if(count($new_list)>0) {
            foreach ($new_list as $element) {
                $this->file_list[] = $element;
            }
        }
    }
}

?>

Осталось только создать сам скрипт, который будет добавлять водяной знак на изображения, создаем run.php и пишем в нем:

getFileList();

    //Грузим водяной знак для миниатюры
    $imgWaterMin = imagecreatefrompng(image_min_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для миниатюр);
    $imgWaterMinHeight = imagesy($imgWaterMin);
    $imgWaterMinWidth = imagesx($imgWaterMin);
    imagealphablending($imgWaterMin, true);//устанавливам режим смешивания изображения

    //Грузим стандартный водяной знак
    $imgWater = imagecreatefrompng(image_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для основных изображений);
    $imgWaterHeight = imagesy($imgWater);
    $imgWaterWidth = imagesx($imgWater);
    imagealphablending($imgWater, true);

    //Теперь загружаем картинки на которые будем наносить водяной знак
    foreach ($file_list as $file) {
        $fmask = substr(strtolower($file), -3);
        switch ($fmask) {
            case 'png':
                $image = imagecreatefrompng($file);
                break;
            case 'jpg':
                $image = imagecreatefromjpeg($file);
                break;
            default :
                new Exception(Нету реализации для обработки данного формата);
                break;
        }
        if ($image === false) {
            echo Не удалось загрузить файл $filen;
        } else {
            imagealphablending($image, true);
            //Добавляем водяной знак
            $imgWidth = imagesx($image);
            $imgHeight = imagesy($image);
            if (($imgHeight <= img_min_height) && ($imgWidth <= img_min_width)) {
                imagecopy($image, $imgWaterMin, $imgWidth - $imgWaterMinWidth,
                        $imgHeight - $imgWaterMinHeight, 0, 0, $imgWaterMinWidth, $imgWaterMinHeight);
            } else {
                imagecopy($image, $imgWater, $imgWidth - $imgWaterWidth,
                        $imgHeight - $imgWaterHeight, 0, 0, $imgWaterWidth, $imgWaterHeight);
            }
            //Сохраняем результат
            imagejpeg($image,$file);
            imagedestroy($image);
        }
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Наш скрипт готов, теперь проверим его. В файле run.php в строке

//Получаем список фалов
    $dir = new DirectoryList('D:putty_key', true);
    $file_list = $dir->getFileList();

мы указали путь к директории, в ней у нас находятся файлы в которые будет добавлен водяной знак
Директория Запускаем наш скрипт из консоли или из под веб сервера, обратившись к файлу run.php
И видим результат работы:
Результат
Все графические файлы в указанном каталоге стали с водяным знаком. Исходник можете скачать по ссылке ImageWater.rar