Site on bitrix. I want a watermark to be placed when uploading any images to certain IBs, this is what is written:

<? AddEventHandler("iblock", "OnBeforeIBlockElementAdd", array("SrWatermark", "OnBeforeIBlockElementAdd")); AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", array("SrWatermark", "OnBeforeIBlockElementUpdate")); class SrWatermark { function OnBeforeIBlockElementAdd (&$arFields) { if($arFields["IBLOCK_ID"] == 14 || $arFields["IBLOCK_ID"] == 15 || $arFields["IBLOCK_ID"] == 16 || $arFields["IBLOCK_ID"] == 17 || $arFields["IBLOCK_ID"] == 18) { if (strlen($arFields["DETAIL_PICTURE"]["tmp_name"]) > 0) { $filepath = $arFields["DETAIL_PICTURE"]["tmp_name"]; $logopath = $_SERVER["DOCUMENT_ROOT"].'/i/waterimg.png'; $watermark = new watermarkImg(); $watermark->SetLogo($filepath, $logopath); } if (strlen($arFields["MORE_PHOTO"]["tmp_name"]) > 0) { $filepath = $arFields["MORE_PHOTO"]["tmp_name"]; $logopath = $_SERVER["DOCUMENT_ROOT"].'/i/waterimg.png'; $watermark = new watermarkImg(); $watermark->SetLogo($filepath, $logopath); } } } function OnBeforeIBlockElementUpdate (&$arFields) { if($arFields["IBLOCK_ID"] == 14 || $arFields["IBLOCK_ID"] == 15 || $arFields["IBLOCK_ID"] == 16 || $arFields["IBLOCK_ID"] == 17 || $arFields["IBLOCK_ID"] == 18) { if (strlen($arFields["DETAIL_PICTURE"]["tmp_name"]) > 0) { $filepath = $arFields["DETAIL_PICTURE"]["tmp_name"]; $logopath = $_SERVER["DOCUMENT_ROOT"].'/i/waterimg.png'; $watermark = new watermarkImg(); $watermark->SetLogo($filepath, $logopath); } if (strlen($arFields["MORE_PHOTO"]["tmp_name"]) > 0) { $filepath = $arFields["MORE_PHOTO"]["tmp_name"]; $logopath = $_SERVER["DOCUMENT_ROOT"].'/i/waterimg.png'; $watermark = new watermarkImg(); $watermark->SetLogo($filepath, $logopath); } } } } class watermarkImg { function SetLogo($filename, $logo) { $ar_img = getimagesize($filename); if($ar_img["mime"] == 'image/jpeg'){ $srcImage = imagecreatefromjpeg($filename);} elseif($ar_img["mime"] == 'image/png'){ $srcImage = ImageCreateFromPNG($filename);} elseif($ar_img["mime"] == 'image/gif'){ $srcImage = imagecreatefromgif($filename);} else return false; $logoImage = ImageCreateFromPNG($logo); $srcWidth = ImageSX($srcImage); $srcHeight = ImageSY($srcImage); $logoWidth = ImageSX($logoImage); $logoHeight = ImageSY($logoImage); imageAlphaBlending($logoImage, false); imageSaveAlpha($logoImage, true); $trcolor = ImageColorAllocate($logoImage, 255, 255, 255); ImageColorTransparent($logoImage , $trcolor); imagecopy($srcImage, $logoImage, $srcWidth - $logoWidth, $srcHeight - $logoHeight, 0, 0, $logoWidth, $logoHeight); ImagePNG($srcImage, $filename); ImageDestroy($logoImage); ImageDestroy($srcImage); } } ?> 

This is a miracle, for some reason it does not work.

  • one
    Describe the error something. Or buy a bit of bitriks and check?) - Sh4dow
  • Error - the watermark is not superimposed, what exactly I do not know. And no need to buy, it is free for 30 days. Unfortunately, I didn’t manage to figure it out myself; I was sitting for half a day today. - Tchort

4 answers 4

Offhand - check the rights to the uploaded file

 substr(sprintf('%o', fileperms($filename)), -4) 

, try testing the function separately (on 2 existing files with permissions 0777), check, finally, the existence of both files (logo and loaded, file_exists function).

By the way, as far as I remember, $arFields["DETAIL_PICTURE"] already contains the path, or not?

  • $arFields["DETAIL_PICTURE"] contains the path from the root - Tchort
  • So the path will then be not $arFields["DETAIL_PICTURE"]['tmp_name'] (array-string? O_O), but $_SERVER['DOCUMENT_ROOT'].'/'.$arFields["DETAIL_PICTURE"] . <hr /> $arFields["MORE_PHOTO"] is like an array in general. <hr /> In short, use the die(var_dump($var, $var2[, ..., $varN])) construction with buggy variables more often. - Sh4dow

Try this: the most flexible and convenient watermark .

    In theory, this module draws the logo into the picture, that is, it will not display anything, once launched the script, the picture overlapped, and forever.

      PHP watermark