• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/file.php
  • Класс: CFile
  • Вызов: CFile::ResizeImageFile
static function ResizeImageFile($sourceFile, &$destinationFile, $arSize, $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL, $arWaterMark = array(), $quality=false, $arFilters=false)
{
	$io = CBXVirtualIo::GetInstance();

	if (!$io->FileExists($sourceFile))
		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"]);

	$sourceImage = new FileImage($io->GetPhysicalName($sourceFile));
	$sourceInfo = $sourceImage->getInfo();

	if ($sourceInfo === null || !$sourceInfo->isSupported())
	{
		return false;
	}

	$fileType = $sourceInfo->getFormat();

	$orientation = 0;
	if($fileType == FileImage::FORMAT_JPEG)
	{
		$exifData = $sourceImage->getExifData();
		if (isset($exifData['Orientation']))
		{
			$orientation = $exifData['Orientation'];
			//swap width and height
			if ($orientation >= 5 && $orientation <= 8)
			{
				$sourceInfo->swapSides();
			}
		}
	}

	$result = false;

	$sourceRectangle = $sourceInfo->toRectangle();
	$destinationRectangle = new Rectangle($arSize["width"], $arSize["height"]);

	$needResize = $sourceRectangle->resize($destinationRectangle, $resizeType);

	$hLock = $io->OpenFile($sourceFile, "r+");
	$useLock = defined("BX_FILE_USE_FLOCK");

	if ($hLock)
	{
		if ($useLock)
		{
			flock($hLock, LOCK_EX);
		}
		if ($io->FileExists($destinationFile))
		{
			$destinationInfo = (new FileImage($io->GetPhysicalName($destinationFile)))->getInfo();
			if ($destinationInfo)
			{
				if($destinationInfo->getWidth() == $destinationRectangle->getWidth() && $destinationInfo->getHeight() == $destinationRectangle->getHeight())
				{
					//nothing to do
					$result = true;
				}
			}
		}
	}

	if($result === false)
	{
		if ($io->Copy($sourceFile, $destinationFile))
		{
			$destinationImage = new FileImage($io->GetPhysicalName($destinationFile));

			if($destinationImage->load())
			{
				if ($orientation > 1)
				{
					$destinationImage->autoRotate($orientation);
				}

				$modified = false;
				if ($needResize)
				{
					// actual sizes
					$sourceRectangle = $destinationImage->getDimensions();
					$destinationRectangle = new Rectangle($arSize["width"], $arSize["height"]);

					$sourceRectangle->resize($destinationRectangle, $resizeType);

					$modified = $destinationImage->resize($sourceRectangle, $destinationRectangle);
				}

				if(!is_array($arFilters))
				{
					$arFilters = [];
				}

				if(is_array($arWaterMark))
				{
					$arWaterMark["name"] = "watermark";
					$arFilters[] = $arWaterMark;
				}

				foreach($arFilters as $arFilter)
				{
					if($arFilter["name"] == "sharpen" && $arFilter["precision"] > 0)
					{
						$modified |= $destinationImage->filter(FileImageMask::createSharpen($arFilter["precision"]));
					}
					elseif($arFilter["name"] == "watermark")
					{
						$watermark = ImageWatermark::createFromArray($arFilter);
						$modified |= $destinationImage->drawWatermark($watermark);
					}
				}

				if($modified)
				{
					if($quality === false)
					{
						$quality = COption::GetOptionString('main', 'image_resize_quality');
					}

					$io->Delete($destinationFile);

					if($fileType == FileImage::FORMAT_BMP)
					{
						$destinationFile .= ".jpg";
						$destinationImage->saveAs($io->GetPhysicalName($destinationFile), $quality, FileImage::FORMAT_JPEG);
					}
					else
					{
						$destinationImage->save($quality);
					}

					$destinationImage->clear();
				}
			}

			$result = true;
		}
	}

	if ($hLock)
	{
		if ($useLock)
		{
			flock($hLock, LOCK_UN);
		}
		fclose($hLock);
	}

	return $result;
}