- Модуль: 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;
}