Добавляем водяной знак к изображению при помощи PHP
Для начало нам нужно создать изображения с водяным знаком, мне проше все это сделать в 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