Метод ResizeImageGet


В 1С Битрикс существует метод изменения размера изображения CFile::ResizeImageGet() который может изменить размер изображения (с учётом пропорции или без него), его качество, обрезать изображения. Этот метод сохраняет уменьшенную копию изображения в папку /upload/resize_cache/ . При повторном вызове и актуальности кеша, метод сразу вернёт путь к ранее созданной картинке, что значительно экономит ресурс сервера.  Метод принимает следующие параметры:

Параметр Описание Доступно с версии
file Идентификатор файла из таблицы b_file или массив описания файла (Array(FILE_NAME, SUBDIR, WIDTH, HEIGHT, CONTENT_TYPE)), полученный методом GetFileArray()
Size Массив в виде ['width'=>100, 'height'=>150] со значениями ширины и высоты для уменьшаемой картинки. Оба ключа обязательны.
resizeType Тип масштабирования изображения:

  • BX_RESIZE_IMAGE_EXACT — масштабирует в прямоугольник $arSize c сохранением пропорций, обрезая срезания части изображения;
  • BX_RESIZE_IMAGE_PROPORTIONAL — масштабирует с сохранением пропорций, размер ограничивается $arSize, т.е. если какая-то часть изображения не попала в размеры $arSize, она будет удалена;
  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT — масштабирует с сохранением пропорций за ширину при этом принимается максимальное значение из высоты/ширины, размер ограничивается $arSize, улучшенная обработка вертикальных картинок.

Тут нас будут интересовать первые 2 метода.

InitSizes Флаг возвращения в результирующем массив размеров измененной картинки. true — возвращает, false — нет
Filters Массив массивов для постобработки картинки с помощью фильтров: [['name' => 'sharpen', 'precision' => 15]]. Фильтров пока один — sharpen. Задавать его не обязательно — будет инициализирован автоматом. Используется для наведения резкости у миниатюр. 10.0.4
Immediate Флаг передается в обработчик события OnBeforeResizeImage, по смыслу означает масштабирование непосредственно при вызове метода. Обработчик в принципе может выполнять отложенное масштабирование. 12.0.10
jpgQuality Число, устанавливающее в процентах качество JPG при масштабировании. Чем больше значение, тем выше кач



Вызывается метод примерно вот так:

$file = CFile::ResizeImageGet(
	$uInfo['PERSONAL_PHOTO'], 
	['width'=>150, 'height'=>150, 
	BX_RESIZE_IMAGE_PROPORTIONAL, 
	true
);          
      
$img = '<img src="'.$file['src'].'" width="'.$file['width'].'" height="'.$file['height'].'" />';

Получается довольно громоздко и неудобно. И поэтому я в своей работе использую обёртку для этой функции которая выглядит так:

/**
 * Ресайз изображения с проверкой атрибутов
 * @param $photo id картинки или массив содержащий id
 * @param $wi ширина
 * @param $hi высота
 * @param $mode тип масштабирования при ресайзе (обрезать изображение или пропорционально уменьшать)
 * @return mixed
 */
function ResizeImage($photo, $wi, $hi, $mode = false){
    if(is_array($photo)) $photo = $photo["ID"];
    if($wi > 0 && $hi > 0){
        $arPhoto = CFile::ResizeImageGet($photo, Array("width" => $wi, "height" => $hi), ($mode ? BX_RESIZE_IMAGE_EXACT : BX_RESIZE_IMAGE_PROPORTIONAL), true, false, false, 100);
        $src = $arPhoto["src"];
    } else {
        $arPhoto = CFile::GetFileArray($photo);
        $src = $arPhoto["SRC"];
    }
    return $src;
}

Добавить её нужно в файл init.php расположенный или в папке /bitrix/php_interface/ или в папке /local/php_interface/ если он есть и там и там, то у local будет приоритет.
Пользоваться ей в коде гораздо проще. Ей необходимо передать в коде ID изображения или массив описывающий его, например $arItem['PREVIEW_PICTURE'] это массив картинки для анонса, например в компоненте «Список новостей» bitrix:news, в этом случае функция сама найдёт идентификатор изображения по ключу ID. Далее передаётся размер. Параметр $mode влияет на то как изображение будет уменьшено. Не обязательный, по умолчанию false, что приводит к пропорциональному уменьшению изображения без удаления части картинки.

Применение функции

Пример вызова пользовательской функции ресайза:


<img src="<?=ResizeImmage($arItem['PREVIEW_PICTURE'], 100, 100, true);?>" alt="<?=$arItem['NAME'];?>">

Как видите такой вызов гораздо короче и лучше читается. По желанию можно доработать эту функцию и например добавлять к изображению водяной знак.

Полезная статья?
(Голосов: 7, Рейтинг: 2.54)
Вам также могут понравиться
Английский для программистов

Английский для программистов

Почему IT-специалисту необходимо освоить английский язык? Разбираем в статье.

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как правильно подключать стили и скрипты к шаблону 1С Битрикс.

Генерация оглавления статьи

Генерация оглавления статьи

В статье рассмотрен пример функции для генерации оглавления статьи блога или новости


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке