Правильное наложение вотермарка на изображение через htaccess

Исходный код файла «.htaccess»
DirectoryIndex index.php

<FilesMatch "\.(gif|jpg|jpeg|png)$">
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ /watermark/_watermark.php [T=application/x-httpd-php,L,QSA]
</FilesMatch>

Исходный код файла «_watermark.php»

<?php
 
waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI']);
 
function waterMark($original)
{
 
        $original = urldecode($original);
        $info_o = @getImageSize($original);
        if (!$info_o)
                return false;
        $info_w = @getImageSize('watermark.png');
        if (!$info_w)
                return false;
 
        header("Content-Type: ".$info_o['mime']);
 
        $original = @imageCreateFromString(file_get_contents($original));
        $watermark = @imagecreatefrompng("watermark.png");
        $out = imageCreateTrueColor($info_o[0],$info_o[1]);
 
        imageCopyMerge($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1], 100);
        // Водяной знак накладываем только на изображения больше 250 пикселей по вертикали и по горизонтали
        if( ($info_o[0] > 250) && ($info_o[1] > 250) )
        {
                // Для изображений без альфа-канала
                // Последний параметр функции - степень непрозрачности водяного знака
                imageCopyMerge($out, $watermark, ($info_o[0]-$info_w[0])/2, ($info_o[1]-$info_w[1])/2, 0, 0, $info_w[0], $info_w[1], 25);
 
                // Для изображений с альфа-каналом
                // В этом случае прозрачность регулируется альфа-каналом самого изображения
                // imageCopy($out, $watermark, ($info_o[0]-$info_w[0])/2, ($info_o[1]-$info_w[1])/2, 0, 0, $info_w[0], $info_w[1]);
        }
 
        switch ($info_o[2])
        {
        case 1:
                imageGIF($out);
                break;
        case 2:
                imageJPEG($out);
                break;
        case 3:
                imagePNG($out);
                break;
        default:
                return false;
        }
 
        imageDestroy($out);
        imageDestroy($original);
        imageDestroy($watermark);
 
        return true;
}
 
?>

Решение сводится к следующему, в каталог с файлами изображений помещается файл «.htaccess». Кроме него на сервере создается папка «watermark», в которой находится файл скрипта «_watermark.php» и собственно файл водяного знака «watermark.png».

При этом мною, по сравнению с оригинальной версией, встреченной в интернете, были внесены незначительные изменения в оба текстовых файла.

В файл «.htaccess», в регулярное выражение поиска файлов изображений добавлено расширение «jpeg», как тоже часто встречающееся.

Скрипт «_watermark.php» переработан таким образом, чтобы помещать водяной знак по центру изображения (этого требовала специфика решаемой задачи) и добавлена возможность регулировать прозрачность создаваемого водяного знака (комментарии в теле скрипта помогут Вам самостоятельно настроить этот параметр).

Также следует обратить внимание на тот факт, что помещая папку «watermark» в папку с изображениями, как советуют оригинальные источники, мы не добьемся желаемого результата, т.к. в этом случае нам придется иметь в каждой папке свой собственный файл «.htaccess» и папку «watermark». Это связано с тем, что в файле «.htaccess» указываются абсолютные пути от корневого каталога сайта к файлу «_watermark.php». Таким образом, имея в каждой папке с изображениями отдельную подпапку «watermark», в случае необходимости изменить водяной знак (либо скрипт, накладывающий его на изображение), нам придется произвести изменения во всех папках.

Обновлено: 28/01/2015 — 21:55

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *