Имеем исходную картинку 968 x 544 px
Хотим ее уменьшить до ширины 240px
В фотошопе или браузере уменьшаем и получаем картинку 240px x 135px
Отлично, применяем:
[COLOR=#a9b7c6][COLOR=#9876aa]$arSize[/COLOR]= [COLOR=#cc7832]array[/COLOR]([COLOR=#6a8759]'width'[/COLOR]=>[COLOR=#6897bb]240[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#6a8759]'height'[/COLOR]=>[COLOR=#6897bb]135[/COLOR])[COLOR=#cc7832];[/COLOR][/COLOR]
[COLOR=#a9b7c6][COLOR=#9876aa]$FILE [/COLOR]= CFile::[COLOR=#ffc66d]ResizeImageGet[/COLOR]([COLOR=#9876aa]$photo[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]$arSize[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]BX_RESIZE_IMAGE_PROPORTIONAL[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#cc7832]true[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#cc7832]array[/COLOR]() )[COLOR=#cc7832];
[/COLOR][/COLOR]Смотрим содержимое массива:
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
имеется функция:[COLOR=#a9b7c6][COLOR=#cc7832] [/COLOR][COLOR=#ed008c][SIZE=14pt]ScaleImage[/SIZE][/COLOR][/COLOR]
Внутри этой функции и скрывается причина,
[COLOR=#a9b7c6][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"width"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]intval([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageWidth[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"height"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]intval([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageHeight[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#000000]Округление происходит путем отбрасывания дробной части, а не до ближайшего целого.
Я заменил функцию intval на round
[/COLOR][/COLOR][COLOR=#a9b7c6][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"width"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]round([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageWidth[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"height"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]round([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageHeight[/COLOR]))[COLOR=#cc7832];
[COLOR=#000000]Результат такой как надо.
Править что то в ядре последнее дело, но других вариантов пока нет.
Ждем реакции разработчиков.
[/COLOR][/COLOR][/COLOR]
Хотим ее уменьшить до ширины 240px
В фотошопе или браузере уменьшаем и получаем картинку 240px x 135px
Отлично, применяем:
[COLOR=#a9b7c6][COLOR=#9876aa]$arSize[/COLOR]= [COLOR=#cc7832]array[/COLOR]([COLOR=#6a8759]'width'[/COLOR]=>[COLOR=#6897bb]240[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#6a8759]'height'[/COLOR]=>[COLOR=#6897bb]135[/COLOR])[COLOR=#cc7832];[/COLOR][/COLOR]
[COLOR=#a9b7c6][COLOR=#9876aa]$FILE [/COLOR]= CFile::[COLOR=#ffc66d]ResizeImageGet[/COLOR]([COLOR=#9876aa]$photo[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]$arSize[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#9876aa]BX_RESIZE_IMAGE_PROPORTIONAL[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#cc7832]true[/COLOR][COLOR=#cc7832], [/COLOR][COLOR=#cc7832]array[/COLOR]() )[COLOR=#cc7832];
[/COLOR][/COLOR]Смотрим содержимое массива:
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
имеется функция:[COLOR=#a9b7c6][COLOR=#cc7832] [/COLOR][COLOR=#ed008c][SIZE=14pt]ScaleImage[/SIZE][/COLOR][/COLOR]
Внутри этой функции и скрывается причина,
[COLOR=#a9b7c6][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"width"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]intval([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageWidth[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"height"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]intval([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageHeight[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#000000]Округление происходит путем отбрасывания дробной части, а не до ближайшего целого.
Я заменил функцию intval на round
[/COLOR][/COLOR][COLOR=#a9b7c6][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"width"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]round([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageWidth[/COLOR]))[COLOR=#cc7832];
[/COLOR][COLOR=#9876aa]$arDestinationSize[/COLOR][[COLOR=#6a8759]"height"[/COLOR]] = max([COLOR=#6897bb]1[/COLOR][COLOR=#cc7832], [/COLOR]round([COLOR=#9876aa]$iResizeCoeff [/COLOR]* [COLOR=#9876aa]$sourceImageHeight[/COLOR]))[COLOR=#cc7832];
[COLOR=#000000]Результат такой как надо.
Править что то в ядре последнее дело, но других вариантов пока нет.
Ждем реакции разработчиков.
[/COLOR][/COLOR][/COLOR]