Оглавление
Метод 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 |
Тип масштабирования изображения:
Тут нас будут интересовать первые 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'];?>">
Как видите такой вызов гораздо короче и лучше читается. По желанию можно доработать эту функцию и например добавлять к изображению водяной знак.