Москва
(495)240-82-20
Ростов-на-Дону
(863)219-77-00
   

Как на PHP реализовать Watermark?

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Как на PHP реализовать Watermark?
 
Здесь вы пишете, что встроили автоматическое наложение водяного знака на закачиваемые изображения. Причем, встроили это в 1С-Битрикс. Подскажите, какими средствами?
 
Функционал битрикса позволяет в качестве вотермарка использовать только текст, как же быть если нужно картинкой? Пишем скрипт
Код
<?

// class.photo.php

class Photo
{
    var $sError;
    var $arProp;

    function Error()
    {
       if(strlen($this->sError))
       {
            $arError[1] = 'Неправильные параметры';
            $arError[2] = 'Задайте необходимые размер/ы';
            $arError[3] = 'Укажите путь';
            $arError[4] = 'Укажите верный путь';
            $arError[5] = 'Неправильный формат файла';
            $arError[6] = 'Поддерживается работа только с форматами JPEG и GIF';
            $arError[7] = 'Ваша билиотека GD не поддерживает работы с форматами JPEG';
            $arError[8] = 'Ваша билиотека GD не поддерживает работы с форматами GIF';
            $arError[9] = 'Не удалось обновить файл по заданому пути';
            $arError[10] = 'Не удалось создать файл по заданому пути';
            $this->arProp['MSG_ERROR'] = $arError[$this->sError];
            $this->arProp['CODE'] = $this->sError;
           return $this->arProp;
        }
    }

    function Resize($arPhoto = array())
    {
       return $this->Correct($arPhoto);
    }

    function Correct($arPhoto = array())
    {
       if(!is_array($arPhoto)){
           $this->sError = 1;
        }else{
          if(empty($arPhoto['WIDTH']) || empty($arPhoto['HEIGHT'])){
               $this->sError = 2;
           }elseif(empty($arPhoto['PATH'])){
               $this->sError = 3;
           }else{
                $sFullPath = $arPhoto['PATH'];
                $sFullPathFrom = $sFullPath;
               if(!file_exists($sFullPath)){
                   $this->sError = 4;
               }else{
                    if(!empty($arPhoto['PATH_FROM'])){
                        $sFullPathFrom = $arPhoto['PATH_FROM'];
                        if(file_exists($sFullPathFrom)){
                           if(!unlink($sFullPathFrom)){
                               $this->sError = 9;
                            }
                        }
                       if(!copy($sFullPath, $sFullPathFrom)){
                           $this->sError = 10;
                        }else{
                           if(!chmod($sFullPathFrom, 0777)){
                               $this->sError = 9;
                            }
                        }
                   }
                    if($this->Error()){
                       return $this->Error();
                   }
                   clearstatcache();
                   $arPhotoProp = @getimagesize($sFullPath);
                   if(empty($arPhotoProp['mime'])){
                       $this->sError = 5;
                   }else{
                        $this->arProp = array(
                        'PATH' => $sFullPath,
                        'PATH_FROM' => $sFullPathFrom,
                        'MIME' => $arPhotoProp['mime'],
                        'REAL_WIDTH' => $arPhotoProp[0],
                        'REAL_HEIGHT' => $arPhotoProp[1],
                        'SET_WIDTH' => (int)$arPhoto['WIDTH'],
                        'SET_HEIGHT' => (int)$arPhoto['HEIGHT'],
                        'SET_HEIGHT' => (int)$arPhoto['HEIGHT'],
                        'FIX' => (!empty($arPhoto['FIX'])?1:0),
                        'MARK' => (!empty($arPhoto['MARK'])?1:0),
                        'QUALITY' => (empty($arPhoto['QUALITY'])?97:$arPhoto['QUALITY'])
                        );
                        if($arPhoto['MARK'] && $arPhoto['WIDTH']> 100){
                           $this->arProp['MARK'] = $_SERVER['DOCUMENT_ROOT'].'/images/mark.png';
                        }
                       if(($arPhotoProp['mime'] != 'image/jpeg') && ($arPhotoProp['mime'] != 'image/gif')){
                           $this->sError = 6;
                       }else{
                           if(!function_exists('imagecreatefromjpeg') && ($arPhotoProp['mime'] != 'image/jpeg')){
                               $this->sError = 7;
                           }else
                           if(!function_exists('imagecreatefromgif') && ($arPhotoProp['mime'] != 'image/gif')){
                               $this->sError = 8;
                           }else{
                               if($arPhotoProp[0] <= $this->arProp['SET_WIDTH'] && $arPhotoProp[1] <= $this->arProp['SET_HEIGHT']){
                                   if(!$this->arProp['MARK']){
                                      return $this->arProp;
                                   }
                               }
                           }
                       }
                   }
               }
           }
        }
        return $this->Calculus($arPhoto);
    }

   function Calculus($arPhoto)
   {
        if($this->Error())
        {
           return $this->Error();
        }
        $arPS[0] = $this->arProp['REAL_WIDTH'];
        $arPS[1] = $this->arProp['REAL_HEIGHT'];
        if($this->arProp['FIX']){
            $bPriorityX = $this->arProp['REAL_WIDTH'] / $this->arProp['SET_WIDTH'] < $this->arProp['REAL_HEIGHT'] / $this->arProp['SET_HEIGHT']?1:0;
           if($bPriorityX){
               if($this->arProp['SET_WIDTH'] < $arPS[0]){
                   $arPS[1] = round($arPS[1] * ($this->arProp['SET_WIDTH'] / $arPS[0]));
                   $arPS[0] = $this->arProp['SET_WIDTH'];
               }
           }else{
               if($this->arProp['SET_HEIGHT'] < $arPS[1]){
                   $arPS[0] = round($arPS[0] * ($this->arProp['SET_HEIGHT'] / $arPS[1]));
                   $arPS[1] = $this->arProp['SET_HEIGHT'];
               }
           }
            $arPar = array(0, 0, 0, 0, $arPS[0], $arPS[1], $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT']);
           $this->Change($arPS, $arPar, 1);
        }else{
           if($this->arProp['SET_WIDTH'] < $arPS[0]){
                $arPS[1] = round($arPS[1] * ($this->arProp['SET_WIDTH'] / $arPS[0]));
                $arPS[0] = $this->arProp['SET_WIDTH'];
            }
            if($this->arProp['SET_HEIGHT'] < $arPS[1]){
                $arPS[0] = round($arPS[0] * ($this->arProp['SET_HEIGHT'] / $arPS[1]));
                $arPS[1] = $this->arProp['SET_HEIGHT'];
            }
            $arPar = array(0, 0, 0, 0, $arPS[0], $arPS[1], $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT']);
           return $this->Change($arPS, $arPar);
        }

        if($this->arProp['FIX']){
           if($this->arProp['UPDATE_WIDTH'] == $arPS[0] && $this->arProp['UPDATE_HEIGHT'] == $arPS[1]){
                $this->arProp['REAL_WIDTH'] = $arPS[0];
                $this->arProp['REAL_HEIGHT'] = $arPS[1];
               if($bPriorityX){
                    return $this->Change(array($this->arProp['SET_WIDTH'], $this->arProp['SET_HEIGHT']), array(0, 0, 0, (round($this->arProp['UPDATE_HEIGHT'] / 2) - round($this->arProp['SET_HEIGHT'] / 2)), $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT'], $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT']));
               }else{
                   return $this->Change(array($this->arProp['SET_WIDTH'], $this->arProp['SET_HEIGHT']), array(0, 0, (round($this->arProp['UPDATE_WIDTH'] / 2) - round($this->arProp['SET_WIDTH'] / 2)), 0, $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT'], $this->arProp['REAL_WIDTH'], $this->arProp['REAL_HEIGHT']));
               }
           }
        }
    }

    function Change($arPS, $arPar, $bNoMark = 0)
    {
        if($this->arProp['MIME'] == 'image/jpeg'){
           $rCreated[0] = imagecreatefromjpeg($this->arProp['PATH_FROM']);
        }elseif($this->arProp['MIME'] == 'image/gif'){
           $rCreated[0] = imagecreatefromgif($this->arProp['PATH_FROM']);
        }
        $rCreated[1] = imagecreatetruecolor($arPS[0], $arPS[1]);
        if($this->arProp['MIME'] == 'image/gif'){
           $rCreatedTransp = imagecolortransparent($rCreated[0]);
           $rCreatedColor = imagecolorsforindex($rCreated[0], $rCreatedTransp);
           $rCreatedExact = imagecolorexact($rCreated[1], $rCreatedColor['red'], $rCreatedColor['green'], $rCreatedColor['blue']);
           imagefill($rCreated[1], 0, 0, $rCreatedExact);
        }
        imagecopyresampled($rCreated[1], $rCreated[0], $arPar[0], $arPar[1], $arPar[2], $arPar[3], $arPar[4], $arPar[5], $arPar[6], $arPar[7]);
        if($this->arProp['MIME'] == 'image/gif'){
           //imagecolortransparent($rCreated[1], $rCreatedExact);
        }
       if($this->arProp['MIME'] == 'image/jpeg'){
           imagejpeg($rCreated[1], $this->arProp['PATH_FROM'], $this->arProp['QUALITY']);
        }
        if($this->arProp['MIME'] == 'image/gif'){
           imagegif($rCreated[1], $this->arProp['PATH_FROM']);
        }
       imagedestroy($rCreated[0]);
        clearstatcache();
        $arPhotoProp = @getimagesize($this->arProp['PATH_FROM']);
        $this->arProp['UPDATE_WIDTH'] = $arPhotoProp[0];
        $this->arProp['UPDATE_HEIGHT'] = $arPhotoProp[1];
        if($this->arProp['MARK'] && !$bNoMark){
           $watermark = imagecreatefrompng($this->arProp['MARK']);
         $watermark_width = imagesx($watermark);
         $watermark_height = imagesy($watermark);
         $image = imagecreatetruecolor($watermark_width, $watermark_height);
         if($this->arProp['MIME'] == 'image/jpeg'){
            $image = imagecreatefromjpeg($this->arProp['PATH_FROM']);
         }
         if($this->arProp['MIME'] == 'image/gif'){
            $image = imagecreatefromjpeg($this->arProp['PATH_FROM']);
         }
         clearstatcache();
         $size = getimagesize($this->arProp['PATH_FROM']);
         $dest_x = $size[0] - $watermark_width - 5;
         $dest_y = $size[1] - $watermark_height - 5;
         imagecolortransparent($watermark,imagecolorat($watermark,0,0));
         imagecopyresampled($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height);
           imagejpeg($image, $this->arProp['PATH_FROM'], $this->arProp['QUALITY']);
         imagedestroy($image);
         imagedestroy($watermark);
        }
        return $this->arProp;
    }
}
?>


Цепляем на событие

Код
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("PhotoResize", "Change"));


Вызов функционала, примерно следующий

Код
$ob = new Photo();
                $ob->Resize(array(
                   'PATH' => $arFields[$arHandler[$i]['FIELD']]['tmp_name'],
                   'WIDTH' => $arHandler[$i]['WIDTH'],
                   'HEIGHT' => $arHandler[$i]['HEIGHT'],
                    'FIX' => $arHandler[$i]['FIX'],
                    'MARK' => $arHandler[$i]['MARK'],
                ));
 
Coder,
Сделал все как вы написали, водяной знак не наложился. Но в init.php я еще добавил событие при создании элемента.
У вас в коде не указаны инфоблоки на которые накладываются. В таком случае если бы оно заработало оно бы на все картинки водяной знак накладывало?
 
Цитата
Tchort пишет:
Coder,

Сделал все как вы написали, водяной знак не наложился. Но в init.php я еще добавил событие при создании элемента.

У вас в коде не указаны инфоблоки на которые накладываются. В таком случае если бы оно заработало оно бы на все картинки водяной знак накладывало?
1. В init.php подключить файл class.photo.php со скриптом, код которого приведён в сообщении выше

2. Подготовить файл png с картинкой, который будет накладываться на изображения. Файл должен находиться по пути /images/mark.png
Путь можно изменить в файле class.photo.php

2. Добавить обработчики на события изменения и добавления элемента инфоблока (ИБ)
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("PhotoResize", "Change"));
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("PhotoResize", "Change"));

3. В init.php добавить класс обработчик событий добавления и изменения элемента ИБ
Код
class PhotoResize
{
   function Change($arFields)
   {
      $ob = new Photo();
      $ob->Resize(array(
      'PATH' => $arFields['DETAIL_PICTURE']['tmp_name'],
         'WIDTH' => 400,
         'HEIGHT' => 400,
          'FIX' => 0,
          'MARK' => 1,
      ));
   }
}

В ключ 'PATH' передаём путь к закаченному файлу изображения, на который надо наложить картинку (водяной знак) $arFields['DETAIL_PICTURE']['tmp_name']
В данном примере это картинка детального описания. Если необходимо накладывать водяной знак на изображения из других полей, например "Картинка для анонса" или на дополнительные свойства, нужно прописать соответствующий путь к картинке.

Приведённый код будет накладывать водяной знак на элементы всех ИБ. Если нужны конкретные ИБ, нужно добавить условие перед вызовом метода "Resize" с проверкой ID ИБ
Страницы: 1
Читают тему (гостей: 1)
Смотрите также: