Документация для разработчиков
Темная тема

ResizeImageGet

Описание и параметры

array CFile::ResizeImageGet( 
	mixed file, 
	array arSize, 
	const resizeType = BX_RESIZE_IMAGE_PROPORTIONAL, 
	bool bInitSizes = false, 
	array arFilters = false, 
	bool bImmediate = false, 
	bool jpgQuality = false
); 

Метод уменьшает картинку и размещает уменьшенную копию в папку /upload/resize_cache/путь. Один раз уменьшив изображение получаем физический файл, который позволяет при последующих обращениях не проводить операции по уменьшению изображения. При следующем вызове метод вернет путь к уменьшенному файлу. Статический метод.

Параметры

Параметр Описание С версии
file Идентификатор файла из таблицы b_file или массив описания файла (Array(FILE_NAME, SUBDIR, WIDTH, HEIGHT, CONTENT_TYPE)), полученный методом GetFileArray.
Size Массив в виде Array("width"=>WIDTH, "height"=>HEIGHT) со значениями ширины и высоты для уменьшаемой картинки. Оба ключа обязательны.
resizeType Тип масштабирования:
  • BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize c сохранением пропорций, обрезая лишнее;
  • BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize;
  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций за ширину при этом принимается максимальное значение из высоты/ширины, размер ограничивается $arSize, улучшенная обработка вертикальных картинок.
InitSizes Флаг возвращения в результирующем массив размеров измененной картинки. True - возвращает, false - нет
Filters Массив массивов для постобработки картинки с помощью фильтров: array(array("name" => "sharpen", "precision" => 15)). Фильтров пока один - sharpen. Задавать его не обязательно - будет инициализирован автоматом. Используется для наведения резкости у миниатюр. 10.0.4
Immediate Флаг передается в обработчик события OnBeforeResizeImage, по смыслу означает масштабирование непосредственно при вызове метода. Обработчик в принципе может выполнять отложенное масштабирование.12.0.10
jpgQuality Число, устанавливающее в процентах качество JPG при масштабировании. Чем больше значение, тем выше качество и больше размер файла изображения.12.5.0

Возвращаемое значение

Метод возвращает массив вида:

array(
	'src',  // путь к уменьшенной картинке относительно корня сайта.
	'width',  // Если bInitSizes = true ширина уменьшенной картинки, иначе 0.
	'height',  // Если bInitSizes = true высота уменьшенной картинки, иначе 0.
)

В случае ошибки возвращает false.

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

//$uID - идентификатор пользователя
$uDBInfo = CUser::GetByID($uID);
if ($uInfo = $uDBInfo->GetNext())
{
	if ($uInfo['PERSONAL_PHOTO'])
	{
		$file = CFile::ResizeImageGet($uInfo['PERSONAL_PHOTO'], array('width'=>150, 'height'=>150), BX_RESIZE_IMAGE_PROPORTIONAL, true);                
		$img = '<img src="'.$file['src'].'" width="'.$file['width'].'" height="'.$file['height'].'" />';
		$uInfo['PERSONAL_PHOTO'] = $img;
	}
		$arResult['ITEMS'][$k]['USER_INFO'] = $uInfo;
}

Наложить водяной знак можно таким образом:

$arWaterMark = Array(
	array(
		"name" => "watermark",
		"position" => "bottomright", // Положение
		"type" => "image",
		"size" => "real",
		"file" => $_SERVER["DOCUMENT_ROOT"].'/upload/copy.png', // Путь к картинке
		"fill" => "exact",
	)
);
$arFileTmp = CFile::ResizeImageGet(
	$arElement["DETAIL_PICTURE"],
	array("width" => 250, "height" => 127),
	BX_RESIZE_IMAGE_EXACT,
	true,
	$arWaterMark
);


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Вячеслав Докукин
Сообщение не промодерировано, возможны ошибки и неточности.
Готовый метод для сохранения картинки по ссылке, с возможностью изменения размера и наложения watermark
https://github.com/Cleverscript/saveRemoteImg
1
Руслан Ахметгалиев
Сообщение не промодерировано, возможны ошибки и неточности.
Код
<?
$resImage = CFile::ResizeImageGet(
   $arItem["PREVIEW_PICTURE"],
   array("width" => 39, "height" => 39),
   BX_RESIZE_IMAGE_PROPORTIONAL
   );
?>

<div class="photo-block">
   <img src="
      <?if($arItem["PREVIEW_PICTURE"]):?>
         <?= $resImage["src"] ?>
      <?else:?>
         <?= SITE_TEMPLATE_PATH ?>/img/rew/no_photo_left_block.jpg
      <?endif?>
   " alt="">
</div>
2
nezhda
Случалось, что автоматически инициализируемый фильтр sharpen оставлял артефакты на PNG с прозрачностью. Чтобы избежать этого, можно задать precision равным нулю

Код
$arPhotoSmall = CFile::ResizeImageGet(
   $arElement["PREVIEW_PICTURE"]["ID"], 
   array(
      'width'=>100,
      'height'=>420
   ), 
   BX_RESIZE_IMAGE_PROPORTIONALDETAIL_PICTURE,
   Array(
      "name" => "sharpen", 
      "precision" => 0
   )
);
0
Александр Леонов
Для изменения размера watermark'а "fill" => "resize" и "coefficient" => число
4
Александр Семеритов
Чтобы работал 'fill'=>'repeat', в параметрах не должно быть 'size'=>'real'
2
Вячеслав Зыков
Если исходная картинка меньше, чем необходимо ужать, то в папку /upload/resize_cache/ ничего не попадает. Соответственно $file  тоже пустой и картинка может не появляться. Приходится проверять попало ли что-то в массив:

Код
<?if(!isset($file['src'] ) ): $file[src]=путь к старой картинке; endif;?>
3
Михаил
Ресайз и вывод дополнительных фотографий элементов (more_photo):
Код
<? if(count($arResult["MORE_PHOTO"])>0):?>    <?foreach($arResult["MORE_PHOTO"] as $PHOTO):?>        <? $file = CFile::ResizeImageGet($PHOTO, array('width'=>120, 'height'=>'120'), BX_RESIZE_IMAGE_EXACT, true); ?>        <a href="<?=$PHOTO["SRC"]?>" name="more_photo" target="_blank">        <img border="0" src="<?=$file["src"]?>" width="<?=$file["width"]?>" height="<?=$file["height"]?>" alt="<?=$arResult["NAME"]?>" title="<?=$arResult["NAME"]?>" /></a>   <?endforeach?><?endif?>  
2
Savelov
1
scifi
0
diesel
Ещё один пример "динамическое масштабирование изображения средствами сервера"

Код
//получим параметры изображения
$arImgParamsM = CFile::_GetImgParams($arPicID, $iSizeWHTTP, $iSizeHHTTP);
$arSizes=ReturnSizes(180/* целевое ограничение, т.е. max (180x180) */,$arImgParamsM,true);//по параметрам изображения вернуть высоту, ширину и отступы

//сожмём средствами браузера, чтобы не передавать большой размер
$renderImage = CFile::ResizeImageGet($arPicID, Array("width" => $arSizes["MAIN_WIDTH"], "height" => $arSizes["MAIN_HEIGHT"]));


-----
ReturnSizes - не входит в поставку битрикс, собственная функция (легко пишется по вашим требованиям)
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх