Используем метод изменения размера изображения 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;
//И сохраняем в кеш только нужные данные
$arResult['GALLERY_PHOTOS'] = $photos;
$this->__component->SetResultCacheKeys(['GALLERY_PHOTOS']);
}
?>
Как видно из данного примера, по ссылке открывается загруженное фото с размерами указанными в result_modifier.php, а на превью стоит порезанное фото.
Количество просмотров: 603