Имеем исходную картинку 968 x 544 px
Хотим ее уменьшить до ширины 240px
В фотошопе или браузере уменьшаем и получаем картинку 240px x 135px
Отлично, применяем:
$arSize= array('width'=>240, 'height'=>135);
$FILE = CFile::ResizeImageGet($photo, $arSize, BX_RESIZE_IMAGE_PROPORTIONAL, true, array() );
Смотрим содержимое массива:
array(4) {
["src"]=>
string(110) "/upload/resize_cache/iblock/ae8/240_135..."
["width"]=>
int(240)
["height"]=>
int(134)
["size"]=>
int(19634)
}
Высота полученного изображения отличается от ожидаемого на 1px
Так происходит и при автоматическом уменьшении изображений при добавлении картинок инфоблока.
Вопрос почему:
В файле:
/bitrix/modules/main/classes/general/file.php
имеется функция: ScaleImage
Внутри этой функции и скрывается причина,
$arDestinationSize["width"] = max(1, intval($iResizeCoeff * $sourceImageWidth));
$arDestinationSize["height"] = max(1, intval($iResizeCoeff * $sourceImageHeight));
Округление происходит путем отбрасывания дробной части, а не до ближайшего целого.
Я заменил функцию intval на round
$arDestinationSize["width"] = max(1, round($iResizeCoeff * $sourceImageWidth));
$arDestinationSize["height"] = max(1, round($iResizeCoeff * $sourceImageHeight));
Результат такой как надо.
Править что то в ядре последнее дело, но других вариантов пока нет.
Ждем реакции разработчиков.
Хотим ее уменьшить до ширины 240px
В фотошопе или браузере уменьшаем и получаем картинку 240px x 135px
Отлично, применяем:
$arSize= array('width'=>240, 'height'=>135);
$FILE = CFile::ResizeImageGet($photo, $arSize, BX_RESIZE_IMAGE_PROPORTIONAL, true, array() );
Смотрим содержимое массива:
array(4) {
["src"]=>
string(110) "/upload/resize_cache/iblock/ae8/240_135..."
["width"]=>
int(240)
["height"]=>
int(134)
["size"]=>
int(19634)
}
Высота полученного изображения отличается от ожидаемого на 1px
Так происходит и при автоматическом уменьшении изображений при добавлении картинок инфоблока.
Вопрос почему:
В файле:
/bitrix/modules/main/classes/general/file.php
имеется функция: ScaleImage
Внутри этой функции и скрывается причина,
$arDestinationSize["width"] = max(1, intval($iResizeCoeff * $sourceImageWidth));
$arDestinationSize["height"] = max(1, intval($iResizeCoeff * $sourceImageHeight));
Округление происходит путем отбрасывания дробной части, а не до ближайшего целого.
Я заменил функцию intval на round
$arDestinationSize["width"] = max(1, round($iResizeCoeff * $sourceImageWidth));
$arDestinationSize["height"] = max(1, round($iResizeCoeff * $sourceImageHeight));
Результат такой как надо.
Править что то в ядре последнее дело, но других вариантов пока нет.
Ждем реакции разработчиков.