При загрузке картинки в 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);
И лучше картинки не портить водяным знаком, а добавлять его при выводе страницы. Так можно будет при необходимости легко заменить водяной знак, выводить на превьюшках альтернативный или убрать с превьюшек.