Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

вотермарк для картинок инфобока

00 голосов
6
Делаю наложение картинки при добавление элементов в инфоблок, но что-то не выходит, подскажите, где ошибся? Код в init.php:
Код
<?
// Добавление водяной марки
AddEventHandler("iblock", "OnBeforeIBlockElementAdd",   array("SrWatermark", "OnBeforeIBlockElementAdd"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",   array("SrWatermark", "OnBeforeIBlockElementUpdate"));

class SrWatermark
{
   function OnBeforeIBlockElementAdd (&$arFields)
   {    
      header("Content-type: image/png");
      $res = imagecreate(158,158); 
      $img = imagecreatefromjpeg($arFields["DETAIL_PICTURE"]["tmp_name"]);
      $logo = imagecreatefrompng($_SERVER["DOCUMENT_ROOT"]."/images/watermark.png");      
      imagecopyresized ($res,$img,
                  0,0,
                  0,0,
                  158,158,
                  imagesx($img),imagesy($img));
      imagecopy ($res,$logo,60,110,0,0,60,12);
      $trans = imagecolorat($res,0,0);
      imagecolortransparent($res,$trans);
      imagepng($res);
      $arFields["DETAIL_PICTURE"]["tmp_name"] = $res;
      
   }

   function OnBeforeIBlockElementUpdate (&$arFields)
   {
      header("Content-type: image/png");
      $res = imagecreate(158,158); 
      $img = imagecreatefromjpeg($arFields["DETAIL_PICTURE"]["tmp_name"]);
      $logo = imagecreatefrompng($_SERVER["DOCUMENT_ROOT"]."/images/watermark.png");      
      imagecopyresized ($res,$img,
                  0,0,
                  0,0,
                  158,158,
                  imagesx($img),imagesy($img));
      imagecopy ($res,$logo,60,110,0,0,60,12);
      $trans = imagecolorat($res,0,0);
      imagecolortransparent($res,$trans);
      imagepng($res);
      $arFields["DETAIL_PICTURE"]["tmp_name"] = $res;
   }
} 
?>
спросил 02 Окт, 13 от Snezhka (2,240 баллов)

6 Ответы

00 голосов
Не все так просто, интуитивное программирование здесь не пройдет :)
$res - это ресурс на изображение.
Функция imagepng($res) рендерит в аутпут, а не в файл.
Чтобы в файл, надо imagepng($res,'путь.png'). Ну и header() соответственно ни к чему совсем.
А вот потом этот файл надо брать и пихать в иблок через методы класса CFile.
Можно наверное даже и без временного файла обойтись, используя ob_. Но это еще больше запутает.
ответил 14 Окт, 13 от Eddie (2,060 баллов)
00 голосов
понятно, не очень понял только как после изменения картинки пихнуть ее в iblock?
ответил 16 Янв, 14 от Snezhka (2,240 баллов)
00 голосов
Разве такой вариант не пойдет?
Код
imagepng($res,$arFields["DETAIL_PICTURE"]["tmp_name"]);
ответил 04 Май, 14 от Snezhka (2,240 баллов)
00 голосов
Все работает, но только вот вместо прозрачной картинки накладывается белый квадрат..почему так?
и еще, как получить доступ к tmp_name у дополнительного свойства типа файл?
ответил 29 Авг, 14 от Snezhka (2,240 баллов)
00 голосов
Проблема в том, что пнгшка 24бита, если 8 бит, то все хорошо, только вот 8-ка очень страшная выходит, как все таки налодить 24-бита?
ответил 05 Янв, 15 от Snezhka (2,240 баллов)
00 голосов
В Вашем случае, я думаю, можно поступить: брать событие не перед, а после модификации. И в нем брать CFile::GetPath(id_файла), открывать и модифицировать его. Для начала просто попробуйте на нем сверху текст написать и сохранить.
ответил 23 Апр, 15 от Eddie (2,060 баллов)

Похожие вопросы

0 голосов
1 ответ
спросил 29 Фев, 16 от аноним
0 голосов
1 ответ
спросил 19 Июль, 15 от mich802 (220 баллов)
0 голосов
1 ответ
0 голосов
1 ответ
спросил 29 Март, 14 от Scorpiobe (100 баллов)
0 голосов
2 ответов
спросил 12 Март, 14 от oktyabris (100 баллов)