Для ресайза изображений в своих проектах часто использовал конструкцию вида
if(is_array($arItem["PREVIEW_PICTURE"]))
{
$arFileTmp = CFile::ResizeImageGet(
$arItem["PREVIEW_PICTURE"],
array(
"width" => $arParams["DISPLAY_IMG_WIDTH"],
"height" => $arParams["DISPLAY_IMG_HEIGHT"]
),
BX_RESIZE_IMAGE_EXACT,
false
);
$arSize = getimagesize($_SERVER["DOCUMENT_ROOT"].$arFileTmp["src"]);
$arResult["ITEMS"][$key]["PREVIEW_IMG_SMALL"] = array(
"SRC" => $arFileTmp["src"],
"WIDTH" => IntVal($arSize[0]),
"HEIGHT" => IntVal($arSize[1]),
);
} |
Кажется код взят из стандартного магаза.
Но после какого-то недавнего обновления для прозрачных изображений начал появляться черный фон вместо прозрачных пикселов.
Полез в ядро. В общем, если кратко, добавилась поддержка фильтров для изображений. И в результате вызова функции таким образом, как показано выше, к вашему изображению, применяется вот такая штука
switch($arFilter["name"])
{
case "sharpen":
if(function_exists("imageconvolution"))
{
$precision = intval($arFilter["precision"]);
if($precision > 0)
{
$k = 1/$precision;
$mask = array(
array( -$k, -$k, -$k),
array( -$k, 1+8*$k, -$k),
array( -$k, -$k, -$k)
);
imageconvolution($picture, $mask, array_sum($mask[0])+array_sum($mask[1])+array_sum($mask[2]), 0);
}
}
break;
}
} |
В общем, это матрица

! Даже, 3x3. Лучше на английском приведу описание
Applies a convolution matrix on the image, using the given coefficient and offset. |
Вот из-за нее и появляется черный фон.
Как бороться?
Чтобы не применялись фильтры, пишем явно для функции ResizeImageGet() последним параметром - array()
if(is_array($arItem["PREVIEW_PICTURE"]))
{
$arFileTmp = CFile::ResizeImageGet(
$arItem["PREVIEW_PICTURE"],
array(
"width" => $arParams["DISPLAY_IMG_WIDTH"],
"height" => $arParams["DISPLAY_IMG_HEIGHT"]),
BX_RESIZE_IMAGE_EXACT,
false,
array() //убираем черный фон у прозрачных изображений
);
$arSize = getimagesize($_SERVER["DOCUMENT_ROOT"].$arFileTmp["src"]);
$arResult["ITEMS"][$key]["PREVIEW_IMG_SMALL"] = array(
"SRC" => $arFileTmp["src"],
"WIDTH" => IntVal($arSize[0]),
"HEIGHT" => IntVal($arSize[1]),
);
} |
Ну если кто-нибудь из разработчиков увидит, может поправят. Там напутано с параметрами функции по умолчанию.