Битрикс. Resize изображений

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

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

Например, добавляем файл result_modifier.php для шаблона компонента, например, в ходовой news.detail:

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

//Подготовка изображений
if($arResult['PROPERTIES']['KUCHA_PHOTO']['VALUE']){
   $photos = [];
   foreach ($arResult['PROPERTIES']['MUZ_PHOTO']['VALUE'] as $key => $photoId) {
	$arPhoto = CFile::ResizeImageGet($photoId, ['width'=>900, 'height'=>700], BX_RESIZE_IMAGE_PROPORTIONAL);
	$arPhotoBig = CFile::ResizeImageGet($photoId, [], BX_RESIZE_IMAGE_PROPORTIONAL, true, false, false, 100);
	$photos[] = ['SRC'=>$arPhoto['src'], 'SRC_BIG' => $arPhotoBig['src'], 'ALT'=>$arResult['PROPERTIES']['MUZ_PHOTO']['DESCRIPTION'][$key]];
}
 
//И сохраняем в кеш только нужные данные
$arResult['GALLERY_PHOTOS'] = $photos;
$this->__component->SetResultCacheKeys(['GALLERY_PHOTOS']);

}

В шаблон компонента template.php добавляем:

for ($i = 0; $i < count($arResult['GALLERY_PHOTOS']); $i++):
<div class="photo">
  <a href="<?=$arResult['GALLERY_PHOTOS'][$i]['SRC_BIG'];?>" data-fancybox="gallery" data-caption="<?=$arResult['GALLERY_PHOTOS'][$i]['ALT'];?>">
	<img src="<?=$arResult['GALLERY_PHOTOS'][$i]['SRC'];?>" alt="<?=$arResult['GALLERY_PHOTOS'][$i]['ALT'];?>" title="<?=$arResult['GALLERY_PHOTOS'][$i]['TITLE'];?>">
   </a>
</div>
endfor;

Как видно из данного примера, по ссылке открывается загруженное фото с размерами указанными в result_modifier.php, а на превью стоит порезанное фото.


Количество просмотров: 158


Понравилась статья?

Возврат к списку