gifts2017

Вариант изображений с водяными знаками на php

Опубликовал Сергей NSerget (NSerget) в раздел Программирование - Защита и шифрование

Предлагаю вариант использования изображений с наложением водяных знаков на хостинге с использованием php.

Что есть:

  • - хостинг с изображениями;
  • - изображения разбросанные по папкам. Максимальное количество в папках 1000 шт.;
  • - формат изображений jpg и png;
  • - водяные знаки;
  • - небольшой скрипт php, для наложения водяных знаков.

Для чего:

                Многие из вас выгружают свой товар с изображениями на торговые площадки (Аукро, Пром и т.п.). Наложение водяных знаков на этих площадках конечно есть, но ограниченное. Бывает просто изображение или текст, что маловато. Можно конечно сразу наложить водяные знаки, но это долго.  Бывает площадки вводят ограничение на водяные – нельзя указывать адрес сайта на аукро. Данным способом можно обойтись одним экземпляром фотографии, с возможностью наложения множества разных водяных знаков.

Как это работает:

                По запросу http://imgt.вашсайт/14?w=as будет получена картинка с именем 14(jpg,png) с водяным знаком as.png. Если водяной не указывать, то но будет по умолчанию (water.png). Водяные знаки расмещены в папке water. Если картинки нет, то выведеться изображение nofoto.jpg.

 

Файл .htaccess делает жёсткую переадресацию на img.php, получить фото без водяных не выйдет. Содержимое .htaccess :

DirectoryIndex img.php

<IfModule mod_rewrite.c>

                RewriteEngine on

                # Переадресация на img.php

                RewriteRule .$ /домен/imgt/img.php [NC]

</IfModule>

 

Файл img.php производит все функции. Содержимое img.php :

<?php

// Не выводить ошибки
//error_reporting(0);


Get_Image();


function images_search($path, $filename) {
if(($dir = opendir($path)) == FALSE)
return '';
$link = '';
while(($fp = readdir($dir)) !== FALSE) {
$link = $path . '/' . $fp;
if(is_file($link)) {
if($fp == $filename.'.jpg' || $fp == $filename.'.png') {
closedir($dir);
return $link;
}
}else if(! ereg('^[\.]{1,2}$', $fp) && is_dir($link)) {
if($fp != 'water'){
if(($link = images_search($link, $filename)) != '') {
closedir($dir);
return $link;
}
}
}
}
closedir($dir);
return '';
}

// выводим картинку
function Get_Image() {

// Идентификатор изображения
$img_id = strrev($_SERVER[SCRIPT_URL]);
$img_id = strrev(substr($img_id, 0, strpos($img_id,'/')));
$img_id = preg_replace('/[^0-9]/', '', $img_id);


// Идентификатор водяного знака
if (empty($_GET['w'])){
$water_id = 'water';
}else{
$water_id = preg_replace('/[^a-zA-Z0-9]/', '', $_GET['w']);
}

$enable_water = true;

if (!empty($_GET['nw'])){
if ($_GET['nw'] == "1478963") {
$enable_water = false;
}
}

// Изображение
if($img_id == ''){
$image_file = '/home/nsait/seul.net.ua/imgt/nofoto.jpg';
$enable_water = false;
}else{
$image_file = images_search("./", $img_id);
if($image_file){
$image_file = str_replace("./", "/home/nsait/seul.net.ua/imgt", $image_file);
}else{
$image_file = '/home/nsait/seul.net.ua/imgt/nofoto.jpg';
$enable_water = false;
}
}

$pos = strripos($image_file, ".jpg");

//echo $image_file;
//exit;

if ($pos === false) {
$image = imagecreatefrompng($image_file);

//Отключаем режим сопряжения цветов
//imagealphablending($image, false);

//Включаем сохранение альфа канала
imagesavealpha($image, true);

} else {
$image = imagecreatefromjpeg($image_file);
}


if ($image === false) {
return false;
}


if($enable_water){
// Водяной знак
$watermark_file = '/home/nsait/seul.net.ua/imgt/water/'.$water_id.'.png';

if(!file_exists($watermark_file)){
$watermark_file = '/home/nsait/seul.net.ua/imgt/water/water.png';
}
$watermark = imagecreatefrompng($watermark_file); // создаЄм вод¤ной знак


//если что-то пойдЄт не так
if ($watermark === false) {
return false;
}

// получаем значени¤ высоты и ширины изображени¤
$image_width = imagesx($image);
$image_height = imagesy($image);

// получаем значени¤ высоты и ширины вод¤ного знака
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);


$rate_width = $image_width/$watermark_width;
$rate_height = $image_height/$watermark_height;

if ($rate_width > $rate_height)
$rate = $rate_height;
elseif ($rate_width < $rate_height)
$rate = $rate_width;
elseif ($rate_width = $rate_height)
$rate = $rate_height;


// Если
if ($rate < 1) {
$watermark_width = $watermark_width*$rate;;
$watermark_height = $watermark_height*$rate;

$new_watermark = imageCreateTrueColor($watermark_width, $watermark_height);
imageAlphaBlending($new_watermark, false);
imageSaveAlpha($new_watermark,true);
imageCopyResampled($new_watermark, $watermark, 0, 0, 0, 0, $watermark_width, $watermark_height, imagesx($watermark), imagesy($watermark));
} else {
$new_watermark = $watermark;
}


// помещаем вод¤ной знак на изображение
$dest_x = $image_width - $watermark_width;
if ($dest_x <> 0)
$dest_x = $dest_x/2;

$dest_y = $image_height - $watermark_height;
if ($dest_y <> 0)
$dest_y = $dest_y/2;

// создаем новое изображение
imagecopy($image, $new_watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

// освобождаем память
imagedestroy($watermark);
imagedestroy($new_watermark);
}

if ($pos === false) {
header('content-type: image/png');
imagepng($image);

} else {
header('content-type: image/jpeg');
imagejpeg($image, null, 100);
}

// освобождаем память
imagedestroy($image);

}


?>


См. также

Подписаться Добавить вознаграждение

Комментарии

1. Muxomop Muxomop (Muxomop) 18.02.15 16:19
Поздравляю с первой статьей на Инфостарте
2. Сергей NSerget (NSerget) 18.02.15 17:31
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа