Cfile resizeimageget не работает

CFile::ResizeImageGet Ошибка в функции.

Имеем исходную картинку 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 )) ;

Результат такой как надо.

Править что то в ядре последнее дело, но других вариантов пока нет.

Ждем реакции разработчиков.

Разница в 1px или в 10коп или еще в каких либо «незначительных» величинах, для человека не приципиальна скорее всего.

РЕСАЙЗИЛКА битрикса выдает другие размеры изображений (пусть даже в незначительный 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));

Результат такой как надо.

Править что то в ядре последнее дело, но других вариантов пока нет.

Если вы смотрели глазами этот файл, то могли обратить внимание и на этот код:

Dmitry Ban — отличный совет от профессионала, спасибо.

только вот BX_RESIZE_IMAGE_EXACT и BX_RESIZE_IMAGE_PROPORTIONAL немного поразному изображения обрабатывают.

И в инфоблоке когда включаешь уменьшить картинку если боьшая она тоже с таким же округлением: иногда то по высоте, то по ширине пиксел потеряет.

и причем той правкой которую я указал это не лечится. Там используется другая функция.

Цитата
Александр Шарапов написал:
И в инфоблоке когда включаешь уменьшить картинку если боьшая она тоже с таким же округлением: иногда то по высоте, то по ширине пиксел потеряет.

Вы про автоматическое создание PREVIEW_PICTURE из DETAIL_PICTURE?

Я для себя пришёл к следующему решению.

1) В элементе храним только одну картинку достаточно большого размера. Почему только одну? Ну, например, на одном из проектов для показа лент новостей у меня используются такие размеры картинок: 240×180, 100×75, 370×278, 500×330 — и это после редизайна, а до редизайна размеры были другими. По-моему, лучше генерить любые такие картинки по месту из той самой одной-единственной.

(Кстати, забавно, но лучше всего хранить эту картинку в поле PREVIEW_PICTURE, чтобы не возиться с bitrix:rss.out, который умеет брать картинки только
из этого поля).

2) Масштабируем картинки в result_modifier.php шаблона компонента с помощью такой функции:

Как это работает.

В большинстве случаев важна только ширина картинки. Например, на детальной странице новости или в одноколоночной ленте новостей. В этом случае задаём только ширину, а высота будет задана исходным соотношением сторон:

Цитата
Dmitry Ban написал:
В большинстве случаев важна только ширина картинки.
Цитата
Dmitry Ban написал:
Поскольку соотношение сторон редко бывает идеальным, придётся обрезать какую-то часть картинки при показе. Ну, скажем, так
Цитата
Александр Семеритов написал:
При обрезке через css возникает гимор с центрированием изображения, проще будет конечно это сделать, если изображение у товара например задано через background-image но так только битрикс в демо-магазине делает. а флаг EXACT — насколько я помню обрезает отцентрированное изображение.
Цитата
Dmitry Ban написал:
1) В элементе храним только одну картинку достаточно большого размера. Почему только одну? Ну, например, на одном из проектов для показа лент новостей у меня используются такие размеры картинок: 240×180, 100×75, 370×278, 500×330 — и это после редизайна, а до редизайна размеры были другими. По-моему, лучше генерить любые такие картинки по месту из той самой одной-единственной.

(Кстати, забавно, но лучше всего хранить эту картинку в поле PREVIEW_PICTURE, чтобы не возиться с bitrix:rss.out, который умеет брать картинки только
из этого поля).

Я тоже для себя сделал некие выводы, и храню только одну картинку с подрезкой в размеры чуть большие чем надо. Тут полностью согласен.
Храню только детальнуью картинку и делаю ее обязательной если требуется хоть одна картинка, bitrix:rss.out не приходилось возится, по этому до
храниения в поле PREVIEW_PICTURE еще не дошел.

Как правило очень много всего надо дописать в result_modifier.php.

Для себя а переписал компонет bitrix:news.list и теперь пользуюсь rcc:items.list и прямо в компоненте пересчитываю увеличенную картинку и в
превьюшку, и в детальную нужных размеров, размеры задаются в параметрах. Так же научил компонент работать со свойством MORE_PHOTO. B в массиве
$arResult[«ITEMS»] ключами сделал ID элемента.

Наступил на грабли: наличие функций в result_modifier.php. Если надо вывести с одинаковым шаблоном на одной странице двумя компонентами, то получается
что функия с одним названием объявляетя два раза и второй компонет не работает.

Все функции пришлось выносить.

Всегда можно выйти из положения любыми способобами.

Но все же хотелось бы чтобы доработали стандартные функции маштабирования.

BX_RESIZE_IMAGE_EXACT — поровну обрезает с карев которые выступают за область.

И что самое плохое во всем этом — что библитека DG довольно посредственно уменьшает картинки, миниатюры становятся немного замыленными. Особенно заметно на надписях. У меньшенная фотошопом кртинка выглядит намного приятнее.

Источник

Проблема с CFile::ResizeImageGet

Никак не могу понять как работает функция CFile::ResizeImageGet .
Перепробовал кучу вариантов передачи различных параметров, ничего не подошло. Функция ничего не возвращает.
Пример:

А если передавать $arResult[«DETAIL_PICTURE»][«SRC»] функция тоже работать не будет?

Цитата
shlapkoff@gmail.com пишет:
А если передавать $arResult[«DETAIL_PICTURE»][«SRC»] функция тоже работать не будет?

На Малый бизнес все работает а на Старт нет (Обновил ядро тоже не помогло )

если кто то сталкивался с таким проблемам дайте знать

Странно тогда что может быть причиной ?!

Даже оба сайта на одном хостинге размешены. Это же абсурдно, на одном сайте работает, а на другом нет.

Цитата
Azad Rashidov написал:
Вот сам код
Цитата
Azad Rashidov написал:
$arResult[«MORE_PHOTO»]

может все таки у вас MORE_PHOTO это свойство.

и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов

Цитата
Виталий Черепанов написал:
может все таки у вас MORE_PHOTO это свойство.
и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов
Цитата
Денис Сон написал:
и тот ли компонент используется.
Цитата
Денис Сон написал:
Цитата
Azad Rashidov написал:
Вот сам код

А в $arResult[«MORE_PHOTO»] у вас точно есть фотографии?

да да точно фотографии
код рабочий вот тут работает без вопросов http://www.teploenergoplast.ru/catalog/teplotrassa/truby-v-ppu-izolyatsii/ (извините за спам)

Цитата
Денис Сон написал:
Цитата
Виталий Черепанов написал:
может все таки у вас MORE_PHOTO это свойство.
и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов

Если это свойство, то компонент bitrix:catalog.element его сам преобразует и кладет в корень $arResult. Так сказать, разработчики позаботились. Осталось понять от автора темы — не пуст ли данный массив, и тот ли компонент используется.

да я с вами согласен но обратите внимание пожалуйста на резулт и код который на верху отметил.
также на скрин

проблема чем то другой
на счет кода я уверен что все айс
потому что не мало опыта по битриксу

Источник

Проблема с CFile::ResizeImageGet

Никак не могу понять как работает функция CFile::ResizeImageGet .
Перепробовал кучу вариантов передачи различных параметров, ничего не подошло. Функция ничего не возвращает.
Пример:

А если передавать $arResult[«DETAIL_PICTURE»][«SRC»] функция тоже работать не будет?

Цитата
shlapkoff@gmail.com пишет:
А если передавать $arResult[«DETAIL_PICTURE»][«SRC»] функция тоже работать не будет?

На Малый бизнес все работает а на Старт нет (Обновил ядро тоже не помогло )

если кто то сталкивался с таким проблемам дайте знать

Странно тогда что может быть причиной ?!

Даже оба сайта на одном хостинге размешены. Это же абсурдно, на одном сайте работает, а на другом нет.

Цитата
Azad Rashidov написал:
Вот сам код
Цитата
Azad Rashidov написал:
$arResult[«MORE_PHOTO»]

может все таки у вас MORE_PHOTO это свойство.

и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов

Цитата
Виталий Черепанов написал:
может все таки у вас MORE_PHOTO это свойство.
и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов
Цитата
Денис Сон написал:
и тот ли компонент используется.
Цитата
Денис Сон написал:
Цитата
Azad Rashidov написал:
Вот сам код

А в $arResult[«MORE_PHOTO»] у вас точно есть фотографии?

да да точно фотографии
код рабочий вот тут работает без вопросов http://www.teploenergoplast.ru/catalog/teplotrassa/truby-v-ppu-izolyatsii/ (извините за спам)

Цитата
Денис Сон написал:
Цитата
Виталий Черепанов написал:
может все таки у вас MORE_PHOTO это свойство.
и нужно что-то вроде $arResult[«PROPERTIES»][«MORE_PHOTO»][«VALUE»] — тут лежат ID файлов

Если это свойство, то компонент bitrix:catalog.element его сам преобразует и кладет в корень $arResult. Так сказать, разработчики позаботились. Осталось понять от автора темы — не пуст ли данный массив, и тот ли компонент используется.

да я с вами согласен но обратите внимание пожалуйста на резулт и код который на верху отметил.
также на скрин

проблема чем то другой
на счет кода я уверен что все айс
потому что не мало опыта по битриксу

Источник

ResizeImageGet

Описание и параметры

Метод уменьшает картинку и размещает уменьшенную копию в папку /upload/resize_cache/путь. Один раз уменьшив изображение получаем физический файл, который позволяет при последующих обращениях не проводить операции по уменьшению изображения. При следующем вызове метод вернет путь к уменьшенному файлу. Статический метод.

Параметры

Параметр Описание С версии
file Идентификатор файла из таблицы b_file или массив описания файла (Array(FILE_NAME, SUBDIR, WIDTH, HEIGHT, CONTENT_TYPE)), полученный методом GetFileArray.
Size Массив в виде Array(«width»=>WIDTH, «height»=>HEIGHT) со значениями ширины и высоты для уменьшаемой картинки. Оба ключа обязательны.
resizeType Тип масштабирования:
  • BX_RESIZE_IMAGE_EXACT — масштабирует в прямоугольник $arSize c сохранением пропорций, обрезая лишнее;
  • BX_RESIZE_IMAGE_PROPORTIONAL — масштабирует с сохранением пропорций, размер ограничивается $arSize;
  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT — масштабирует с сохранением пропорций за ширину при этом принимается максимальное значение из высоты/ширины, размер ограничивается $arSize, улучшенная обработка вертикальных картинок.
InitSizes Флаг возвращения в результирующем массив размеров измененной картинки. True — возвращает, false — нет
Filters Массив массивов для постобработки картинки с помощью фильтров: array(array(«name» => «sharpen», «precision» => 15)). Фильтров пока один — sharpen. Задавать его не обязательно — будет инициализирован автоматом. Используется для наведения резкости у миниатюр. 10.0.4
Immediate Флаг передается в обработчик события OnBeforeResizeImage, по смыслу означает масштабирование непосредственно при вызове метода. Обработчик в принципе может выполнять отложенное масштабирование. 12.0.10
jpgQuality Число, устанавливающее в процентах качество JPG при масштабировании. Чем больше значение, тем выше качество и больше размер файла изображения. 12.5.0

Возвращаемое значение

Метод возвращает массив вида:

В случае ошибки возвращает false.

Примеры использования

Наложить водяной знак можно таким образом:

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Случалось, что автоматически инициализируемый фильтр sharpen оставлял артефакты на PNG с прозрачностью. Чтобы избежать этого, можно задать precision равным нулю

Если исходная картинка меньше, чем необходимо ужать, то в папку /upload/resize_cache/ ничего не попадает. Соответственно $file тоже пустой и картинка может не появляться. Приходится проверять попало ли что-то в массив:

Ещё один пример «динамическое масштабирование изображения средствами сервера»

——
ReturnSizes — не входит в поставку битрикс, собственная функция (легко пишется по вашим требованиям)

Источник

Читайте также:  Не работает юбисофт коннект пишет что отсутствует соединение
Оцените статью