• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/file.php
  • Класс: CFile
  • Вызов: CFile::ResizeImageGet
static function ResizeImageGet($file, $arSize, $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL, $bInitSizes = false, $arFilters = false, $bImmediate = false, $jpgQuality = false)
{
	if (!is_array($file) && intval($file) > 0)
	{
		$file = static::GetFileArray($file);
	}

	if (!is_array($file) || !array_key_exists("FILE_NAME", $file) || $file["FILE_NAME"] == '')
		return false;

	if ($resizeType !== BX_RESIZE_IMAGE_EXACT && $resizeType !== BX_RESIZE_IMAGE_PROPORTIONAL_ALT)
		$resizeType = BX_RESIZE_IMAGE_PROPORTIONAL;

	if (!is_array($arSize))
		$arSize = array();
	if (!array_key_exists("width", $arSize) || intval($arSize["width"]) <= 0)
		$arSize["width"] = 0;
	if (!array_key_exists("height", $arSize) || intval($arSize["height"]) <= 0)
		$arSize["height"] = 0;
	$arSize["width"] = intval($arSize["width"]);
	$arSize["height"] = intval($arSize["height"]);

	$uploadDirName = COption::GetOptionString("main", "upload_dir", "upload");

	$imageFile = "/".$uploadDirName."/".$file["SUBDIR"]."/".$file["FILE_NAME"];
	$arImageSize = false;
	$bFilters = is_array($arFilters) && !empty($arFilters);

	if (
		($arSize["width"] <= 0 || $arSize["width"] >= $file["WIDTH"])
		&& ($arSize["height"] <= 0 || $arSize["height"] >= $file["HEIGHT"])
	)
	{
		if($bFilters)
		{
			//Only filters. Leave size unchanged
			$arSize["width"] = $file["WIDTH"];
			$arSize["height"] = $file["HEIGHT"];
			$resizeType = BX_RESIZE_IMAGE_PROPORTIONAL;
		}
		else
		{
			if (isset($file["SRC"]))
			{
				global $arCloudImageSizeCache;
				$arCloudImageSizeCache[$file["SRC"]] = array($file["WIDTH"], $file["HEIGHT"]);
			}
			else
			{
				trigger_error("Parameter $file for CFile::ResizeImageGet does not have SRC element. You'd better pass an b_file.ID as a value for the $file parameter.", E_USER_WARNING);
			}

			return array(
				"src" => $file["SRC"],
				"width" => intval($file["WIDTH"]),
				"height" => intval($file["HEIGHT"]),
				"size" => $file["FILE_SIZE"],
			);
		}
	}

	$io = CBXVirtualIo::GetInstance();
	$cacheImageFile = "/".$uploadDirName."/resize_cache/".$file["SUBDIR"]."/".$arSize["width"]."_".$arSize["height"]."_".$resizeType.(is_array($arFilters)? md5(serialize($arFilters)): "")."/".$file["FILE_NAME"];

	$cacheImageFileCheck = $cacheImageFile;
	if ($file["CONTENT_TYPE"] == "image/bmp")
		$cacheImageFileCheck .= ".jpg";

	static $cache = array();
	$cache_id = $cacheImageFileCheck;
	if(isset($cache[$cache_id]))
	{
		return $cache[$cache_id];
	}
	elseif (!file_exists($io->GetPhysicalName($_SERVER["DOCUMENT_ROOT"].$cacheImageFileCheck)))
	{
		if(!is_array($arFilters))
			$arFilters = array(
				array("name" => "sharpen", "precision" => 15),
			);

		$sourceImageFile = $_SERVER["DOCUMENT_ROOT"].$imageFile;
		$cacheImageFileTmp = $_SERVER["DOCUMENT_ROOT"].$cacheImageFile;
		$bNeedResize = true;
		$callbackData = null;

		foreach(GetModuleEvents("main", "OnBeforeResizeImage", true) as $arEvent)
		{
			if(ExecuteModuleEventEx($arEvent, array(
				$file,
				array($arSize, $resizeType, array(), false, $arFilters, $bImmediate),
				&$callbackData,
				&$bNeedResize,
				&$sourceImageFile,
				&$cacheImageFileTmp,
			)))
				break;
		}

		if ($bNeedResize && static::ResizeImageFile($sourceImageFile, $cacheImageFileTmp, $arSize, $resizeType, array(), $jpgQuality, $arFilters))
		{
			$cacheImageFile = mb_substr($cacheImageFileTmp, mb_strlen($_SERVER["DOCUMENT_ROOT"]));

			/****************************** QUOTA ******************************/
			if (COption::GetOptionInt("main", "disk_space") > 0)
				CDiskQuota::updateDiskQuota("file", filesize($io->GetPhysicalName($cacheImageFileTmp)), "insert");
			/****************************** QUOTA ******************************/
		}
		else
		{
			$cacheImageFile = $imageFile;
		}

		foreach(GetModuleEvents("main", "OnAfterResizeImage", true) as $arEvent)
		{
			if(ExecuteModuleEventEx($arEvent, array(
				$file,
				array($arSize, $resizeType, array(), false, $arFilters),
				&$callbackData,
				&$cacheImageFile,
				&$cacheImageFileTmp,
				&$arImageSize,
			)))
				break;
		}

		$cacheImageFileCheck = $cacheImageFile;
	}
	elseif (defined("BX_FILE_USE_FLOCK"))
	{
		$hLock = $io->OpenFile($_SERVER["DOCUMENT_ROOT"].$imageFile, "r+");
		if ($hLock)
		{
			flock($hLock, LOCK_EX);
			flock($hLock, LOCK_UN);
			fclose($hLock);
		}
	}

	if ($bInitSizes && !is_array($arImageSize))
	{
		$imageInfo = (new FileImage($_SERVER["DOCUMENT_ROOT"].$cacheImageFileCheck))->getInfo();
		if($imageInfo)
		{
			$arImageSize[0] = $imageInfo->getWidth();
			$arImageSize[1] = $imageInfo->getHeight();
		}
		else
		{
			$arImageSize = [0, 0];
		}

		$f = $io->GetFile($_SERVER["DOCUMENT_ROOT"].$cacheImageFileCheck);
		$arImageSize[2] = $f->GetFileSize();
	}

	if (!is_array($arImageSize))
	{
		$arImageSize = [0, 0, 0];
	}

	$cache[$cache_id] = array(
		"src" => $cacheImageFileCheck,
		"width" => intval($arImageSize[0]),
		"height" => intval($arImageSize[1]),
		"size" => $arImageSize[2],
	);
	return $cache[$cache_id];
}