В 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'];?>">

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

Вам также могут понравиться

Исключения в PHP, что это и как ими пользоваться

Исключения в PHP, что это и как ими пользоваться

В этой статье вы узнаете что такое исключения в PHP и как их использовать для обработки ошибок. Начиная с PHP версии 5.0 стала доступна новая модель обработки ошибок, так называемые исключения. Она позволяет более гибко и информативно для пользователя обрабатывать не стандартные ситуации в работе вашего приложения. 

Загрузка файлов на сервер средствами PHP

Загрузка файлов на сервер средствами PHP

На данный момент загрузка файлов является одной из необходимых функций любого сайта, будь то загрузка изображения в профиль пользователя, отправка документов при регистрации, размещение прайс листов, создание галереи и т.д. В статье пойдёт речь о реализации загрузки различных файлов на сервер средствами PHP.

Современные способы заработка на сайтах

Современные способы заработка на сайтах

Не для кого не секрет, что в современном мире вы можете зарабатывать определённые деньги на своём сайте ничего не продавая. Говоря «ничего не продавая», я имею ввиду классическую схему, когда вы продаёте свои услуги, перепродаёте товар (предварительно закупая или используя схемы прямой поставки «дроп-шиппинга») или что-то производите. В статье рассмотрим методы, которые не требуют от вас подобных действий. И так, рассмотрим основные методы в порядке возрастания их сложности и времени которое требуется от владельца сайта.


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

Самые читаемые

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Тонкая настройка SEO для результатов фильтрации каталога битрикс

Одним из преимуществ интернет-магазинов на 1С Битрикс на мой взгляд является наличие не так давно до...

Основы SEO оптимизации сайта

Основы SEO оптимизации сайта

Эта статья не истина в последней инстанции, а лишь набор правил которые я применяю при создании/испр...

Собственный тип пользовательских полей в 1С Битрикс

Собственный тип пользовательских полей в 1С Битрикс

Для решения некоторых задач порой не хватает стандартного набора пользовательских полей поставляемых...