+7 (8442) 503-530
Весь сайт

Наложение WaterMark'a на картинку инфоблока 1C-Bitrix

Наложение картинки авторского права не очень проблематичный момент для php программиста, но только если это его программный продукт. Если же это Bitrix, то после очередного обновления все изменения, внесенные в исходный код, будут уничтожены.
Для этого разработчиками компании Bitrix был написан обработчик событий (http://dev.1c-bitrix.ru/api_help/main/general/technology/events.php Event). Данная система позволяет регистрировать обработчик один раз в базе или каждый раз добавлять его «на лету» через init.php (/bitrix/php_interface/init.php).

Сначала нам надо зарегистрировать обработчик и объявить к каким информационным блокам будет применяться данный обработчик.

Код
<?php 
   
   $GLOBALS['WATERMART_IBLOCK'] = array(183); //ID информационных блоков для наложения ватермарка   
   
   require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/include/watermark.php"); //Подключение библиотеки ватермарка
   
   /*
      Добавляем эвенты для обработки картинок
      OnBeforeIBlockElementAdd - Перед добавлением элемента к инфоблоку
      OnBeforeIBlockElementUpdate - Перед изменением элемента инфоблока
   */
   
   AddEventHandler("iblock", "OnBeforeIBlockElementAdd",   array("CWatermark", "OnBeforeIBlockElementAdd")); 
   AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",   array("CWatermark", "OnBeforeIBlockElementUpdate"));
   
?>


И сам файл обработчик, который и будет накладывать картинку

Код
<?php 

   class CWatermark{

   
      /*
         Функции OnBeforeIBlockElementAdd и OnBeforeIBlockElementUpdate принимают все поля добавляемого элемента, и на основании поля IBLOCK_ID принимает решение, надо накладывать картинку или нет
      */
      function OnBeforeIBlockElementAdd (&$arFields){
      
         if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ 
            CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);
         } 
      }

      function OnBeforeIBlockElementUpdate (&$arFields){ 

         if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ 
            CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);
         }
      }
      
      function PostWaterMark(&$_image){

         $_upload_dir = COption::GetOptionString("main", "upload_dir"); //Получаем папку для загрузок
         $wmTarget = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/include/watermark.png"; //Открываем картинку для наложения
         
         $resultImage = imagecreatefromjpeg($_image);
         
         imagealphablending($resultImage, true);

         $_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку
         
         $finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка
         
         /*
            Получаем размеры картинки 
         */
         
         $finalWaterMarkWidth = imagesx($finalWaterMarkImage);
         $finalWaterMarkHeight = imagesy($finalWaterMarkImage);

         /*
            Накладываем PNG поверх картинки с координатами 0.0, т.е. левый верхний угол
            и копируем PNG от 0.0, подробнее http://www.softtime.ru/dic/id_dic=356&id_group=15
         */
         imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0, $finalWaterMarkWidth, $finalWaterMarkHeight);

         /*
            Рисуем изображение, настраиваем прозрачность и сохроняем
         */
         
         imagealphablending($resultImage, false);
         imagesavealpha($resultImage, true);
         imagejpeg($resultImage, $_image, 100);
         
         /*
            Уничтожаем картинки и освобождаем ресурсы
         */
         
         imagedestroy($resultImage);
         imagedestroy($finalWaterMarkImage);
      }
      
      function Clear(){
      
         /*
            Стираем все картинки, которые были сделаны до этого
         */
         
         $_upload_dir = COption::GetOptionString("main", "upload_dir");
         
         $_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/*.jpg");
         foreach($_WFILE as $_file)
            unlink($_file);
         
         return true;
      }
   }
?>


Вот что у нас получилось. WaterMark может быть наложен не только на детальную картинку, и не только JPG, но от нас лишь требовалось показать пример работы данного скрипта.



iNefor
14-09-2010 14:57:23
Красаво, спасибо, дружище ^_^
smile:)
Денис Сминов
11-12-2010 19:51:41
Огромнейшее спасибо за столь элегантное решение! smile;)
Митрофан
22-12-2010 21:04:49
Прикольно smile:) Спасибо за решение! smile:))
splinter
20-01-2011 16:28:23
выдал вот такую ошибку:
Код
Fatal error: Only variables can be passed by reference in /bitrix/php_interface/include/watermark.php on line 5

вот код:
Код
<?php  
   class CWatermark{  
      function OnBeforeIBlockElementAdd (&$arFields){  
         if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){  
            CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);  
         }  
      }  
      function OnBeforeIBlockElementUpdate (&$arFields){  
         if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){  
            CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);  
         }  
      }  
      function PostWaterMark(&$_image){  
         $_upload_dir = COption::GetOptionString("main", "upload_dir"); //Получаем папку для загрузок  
         $wmTarget = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/include/watermark.png"; //Открываем картинку для наложения  
         $resultImage = imagecreatefromjpeg($_image);  
         imagealphablending($resultImage, true);  
         $_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку  
         $finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка  
         $finalWaterMarkWidth = imagesx($finalWaterMarkImage);  
         $finalWaterMarkHeight = imagesy($finalWaterMarkImage);  
         imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0, $finalWaterMarkWidth, $finalWaterMarkHeight);  
         imagealphablending($resultImage, false);  
         imagesavealpha($resultImage, true);  
         imagejpeg($resultImage, $_image, 100);  
         imagedestroy($resultImage);  
         imagedestroy($finalWaterMarkImage);  
      }  
      function Clear(){  
         $_upload_dir = COption::GetOptionString("main", "upload_dir");  
         $_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/*.jpg");  
         foreach($_WFILE as $_file)  
            unlink($_file);  
         return true;  
      }  
   }  
?>

PHP Version 5.2.11
в чём ошибка?
splinter
26-01-2011 11:00:44
Код
   
   
   Просмотр файла    
   
   Просмотр файла
Имя файла:    init.php
Тип:    Скрипт PHP
Размер:    834
Последнее измение:    26.01.2011 11:53:04
Последний доступ:    26.01.2011 12:13:04
 
Содержимое файла
<?php
   $GLOBALS['WATERMART_IBLOCK'] = array(4); //ID информационных блоков для наложения ватермарка   
   require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/include/watermark.php"); //Подключение библиотеки ватермарка
   /*
      Добавляем эвенты для обработки картинок
      OnBeforeIBlockElementAdd - Перед добавлением элемента к инфоблоку
      OnBeforeIBlockElementUpdate - Перед изменением элемента инфоблока
   */
   AddEventHandler("iblock", "OnBeforeIBlockElementAdd",   array("CWatermark", "OnBeforeIBlockElementAdd"));
   AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",   array("CWatermark", "OnBeforeIBlockElementUpdate"));
?> 
Артур
31-08-2011 16:40:00
Код
<?php
require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/watermark.php"); 

AddEventHandler("iblock", "OnBeforeIBlockElementAdd",array("CWatermark", "OnBeforeIBlockElementAdd"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",array("CWatermark", "OnBeforeIBlockElementUpdate"))
?>

<?php
class CWatermark{
function OnBeforeIBlockElementAdd (&$arFields){
if (in_array($arFields['IBLOCK_ID'],
$GLOBALS['WATERMART_IBLOCK'])){
CWaterMark::PostWaterMark(&$arFields["PREVIEW_PICTURE"]
["tmp_name"]);
}
}
function OnBeforeIBlockElementUpdate (&$arFields){
if (in_array($arFields['IBLOCK_ID'],
$GLOBALS['WATERMART_IBLOCK'])){
CWaterMark::PostWaterMark(&$arFields["PREVIEW_PICTURE"]
["tmp_name"]);
}
}
function PostWaterMark(&$_image){
$_upload_dir = COption::GetOptionString("main",
"upload_dir"); //Получаем папку для загрузок
$wmTarget = $_SERVER['DOCUMENT_ROOT'] .
"/bitrix/php_interface/watermark.png"; //Открываем картинку для наложения
$resultImage = imagecreatefromjpeg($_image);
imagealphablending($resultImage, true);
$_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir
. "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку
$finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка
$finalWaterMarkWidth = imagesx($finalWaterMarkImage);
$finalWaterMarkHeight = imagesy($finalWaterMarkImage);
imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0,
$finalWaterMarkWidth, $finalWaterMarkHeight);
imagealphablending($resultImage, false);
imagesavealpha($resultImage, true);
imagejpeg($resultImage, $_image, 100);
imagedestroy($resultImage);
imagedestroy($finalWaterMarkImage);
}
function Clear(){
$_upload_dir = COption::GetOptionString("main",
"upload_dir");
$_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" .
$_upload_dir . "/tmp/*.jpg");
foreach($_WFILE as $_file)
unlink($_file);
return true;
}
}
?>


Не работает. Что не так?
05-09-2011 16:40:33
Класс вроде нормальный, а как он конфигурируется? $GLOBALS['WATERMART_IBLOCK'] не вижу определения переменной

Рассказать друзьям:
 

(function(w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter11313845 = new Ya.Metrika({id:11313845, enableAll: true}); } catch(e) { } }); })(window, "yandex_metrika_call­backs");