При загрузке картинки в png: imagesx(): Argument #1 ($image) must be of type GdImage, bool given

нужна ваша помощь. Есть функция в init.php, которая при создании и обновлении товара на картинки вешается водяной знак. Загружаешь в формате jpg, все норм, а вот в png загружаться не хочет.

init.php

class SrWatermark
{
   static function OnBeforeIBlockElementAdd (&$arFields)
   {
      if (strlen($arFields["DETAIL_PICTURE"]["tmp_name"]) > 0 && $arFields["PROPERTY_VALUES"][71][0]["VALUE"] != 79)
      {
         $filepath = $arFields["DETAIL_PICTURE"]["tmp_name"];
         $result = tempnam("/tmp", "FOO").".jpg";

         $font = $_SERVER['DOCUMENT_ROOT']."/arial.ttf";

         $watermark = new watermark1();
         $img = imagecreatefromjpeg($filepath);
         $im = $watermark->create_watermark($img, "www.profinventar.ru", $font); ('/var/www/u2487576/data/www/profinventar.ru/bitrix/php_interface/init.php:205' - эта ошибка ругается на эту строку)
         $rez = imagejpeg($im, $result, 100);
         if ($rez)
         $arFields["DETAIL_PICTURE"]["tmp_name"] = $result;
      }

     // MORE_PHOTO resize and watermark

     foreach($arFields["PROPERTY_VALUES"]["6"] as $pid=>$arProperty)
     {
        if (strlen($arProperty["VALUE"]["tmp_name"]) > 0)
        {
          $filepath = $arProperty["VALUE"]["tmp_name"];
          // resize
          $imageMaxWidth = 800;
          $imageMaxHeight = 800;
          $imsize = getimagesize($filepath);
          if($imsize[0] > $imageMaxWidth or $imsize[1] > $imageMaxHeight)
          {
            $arFile = CFile::MakeFileArray($filepath);
            $arNewFile = CIBlock::ResizePicture($arFile, array(
               "WIDTH" => $imageMaxWidth,
               "HEIGHT" => $imageMaxHeight,
               "METHOD" => "resample",
            ));
          }
          // watermark
          $result = tempnam("/tmp", "FOO").".jpg";
          $font = $_SERVER['DOCUMENT_ROOT']."/arial.ttf";

          $watermark = new watermark1();
          $img = imagecreatefromjpeg($filepath);
          $im = $watermark->create_watermark($img, "www.profinventar.ru", $font);
          $rez = imagejpeg($im, $result, 100);
             AddMessage2Log($rez,"");
          if ($rez)
          $arFields["PROPERTY_VALUES"]["6"][$pid]["VALUE"]["tmp_name"] = $result;
        }
     }
   }

   static function OnBeforeIBlockElementUpdate (&$arFields)
   {
      //AddMessage2Log("<br/><br/><pre>".print_r($arFields,true)."</pre><br/><br/>", "test");
      
      if (strlen($arFields["DETAIL_PICTURE"]["tmp_name"]) > 0 && $arFields["PROPERTY_VALUES"][71][0]["VALUE"] != 79)
      {
         $filepath = $arFields["DETAIL_PICTURE"]["tmp_name"];
         $result = tempnam("/tmp", "FOO").".jpg";
         $font = $_SERVER['DOCUMENT_ROOT']."/arial.ttf";

         $watermark = new watermark1();
         $img = imagecreatefromjpeg($filepath);
         $im = $watermark->create_watermark($img, "www.profinventar.ru", $font);
         $rez = imagejpeg($im, $result, 100);

         if ($rez)
         $arFields["DETAIL_PICTURE"]["tmp_name"] = $result;
      }

     // MORE_PHOTO resize and watermark

     foreach($arFields["PROPERTY_VALUES"]["6"] as $pid=>$arProperty)
     {
        if (strlen($arProperty["VALUE"]["tmp_name"]) > 0)
        {
          $filepath = $arProperty["VALUE"]["tmp_name"];
          // resize
          $imageMaxWidth = 800;
          $imageMaxHeight = 800;
          $imsize = getimagesize($filepath);
          if($imsize[0] > $imageMaxWidth or $imsize[1] > $imageMaxHeight)
          {
            $arFile = CFile::MakeFileArray($filepath);
            $arNewFile = CIBlock::ResizePicture($arFile, array(
               "WIDTH" => $imageMaxWidth,
               "HEIGHT" => $imageMaxHeight,
               "METHOD" => "resample",
            ));
          }
          // watermark
          $result = tempnam("/tmp", "FOO").".jpg";
          $font = $_SERVER['DOCUMENT_ROOT']."/arial.ttf";

          $watermark = new watermark1();
          $img = imagecreatefromjpeg($filepath);
          $im = $watermark->create_watermark($img, "www.profinventar.ru", $font);
          $rez = imagejpeg($im, $result, 100);
             AddMessage2Log($rez,"");
          if ($rez)
          $arFields["PROPERTY_VALUES"]["6"][$pid]["VALUE"]["tmp_name"] = $result;
        }
     }
   }
}

Выходит следующая ошибка

 [TypeError] 
imagesx(): Argument #1 ($image) must be of type GdImage, bool given (0)
/var/www/u2487576/data/www/profinventar.ru/bitrix/php_interface/lib/watermark.php:6
#0: imagesx(boolean)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/php_interface/lib/watermark.php:6
#1: watermark1->create_watermark(boolean, string, string)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/php_interface/init.php:205
#2: SrWatermark::OnBeforeIBlockElementAdd(array)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/modules/main/tools.php:4734
#3: ExecuteModuleEventEx(array, array)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/modules/iblock/classes/general/iblockelement.php:5202
#4: CAllIBlockElement->CheckFields(array)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/modules/iblock/classes/general/iblockelement.php:3970
#5: CAllIBlockElement->Add(array, boolean, boolean, boolean)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/modules/iblock/admin/iblock_element_edit.php:1193
#6: require(string)
    /var/www/u2487576/data/www/profinventar.ru/bitrix/admin/iblock_element_edit.php:1

watermark.php

class watermark1   
{   
   function create_watermark($main_img_obj, $text, $font, $r = 128, $g = 128, $b = 128, $alpha_level = 100 )   
   {   
      $width = imagesx($main_img_obj);   
      $height = imagesy($main_img_obj);   
      $angle =  -rad2deg(atan2((-$height),($width)));   

      $text = " ".$text." ";   
      
      $c = imagecolorallocatealpha($main_img_obj, $r, $g, $b, $alpha_level);   

      $size = ( ($width+$height) / 2 ) * 2 / strlen($text) - 2; 
      $box  = imagettfbbox ($size, $angle, $font, $text );   

      $x = $width/2 - abs($box[4] - $box[0])/2;   
      $y = $height/2 + abs($box[5] - $box[1])/2;   
      
      imagettftext($main_img_obj,$size ,$angle, $x, $y, $c, $font, $text);   
      return $main_img_obj;   
   }   
}

Ответы (1 шт):

Автор решения: Виктор Карев

Потому что используете $img = imagecreatefromjpeg($filepath); - загрузку из файла jpeg. Понятно, что что эта функция не понимает формат png файла.

Будьте проще, используйте функцию CFile::ResizeImageGet(). Она и смасштабирует, и водяной знак поставит. Например, так:

$arFilter = [[
    'name' => 'watermark',
    'position' => 'center',
    'size' => 'real',
    'alpha_level' => 20,
    'file' => $_SERVER['DOCUMENT_ROOT'] . '/images/watermark.jpg'
]];
$photoUrl = CFile::ResizeImageGet($arFile , ['width' => 1200, 'height' => 720],
    BX_RESIZE_IMAGE_PROPORTIONAL_ALT, false, $arFilter);

И лучше картинки не портить водяным знаком, а добавлять его при выводе страницы. Так можно будет при необходимости легко заменить водяной знак, выводить на превьюшках альтернативный или убрать с превьюшек.

→ Ссылка