%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/photoresizer.php |
<?php
namespace Bitrix\Sale\TradingPlatform\Vk;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\TradingPlatform;
use Bitrix\Main\Application;
Loc::loadMessages(__FILE__);
/**
* Owerwrite system image resize method, because we need increase image
*
* Class PhotoResizer
* @package Bitrix\Sale\TradingPlatform\Vk
*/
class PhotoResizer
{
/**
* Return picture URL by picture src
*
* @param $src
* @param string $domainUrl
* @return string
*/
protected function buildPictureUrl($src, $domainUrl = '')
{
if (strlen($domainUrl) == 0)
{
// get different variants of domainUrl, because in diff site some variants not work
$server = Application::getInstance()->getContext()->getServer();
$host = $server->getHttpHost();
$name = $server->getServerName();
$siteSeverName = SITE_SERVER_NAME;
if ($host)
$domainUrl = $host;
elseif ($name)
$domainUrl = $name;
else
$domainUrl = $siteSeverName;
}
$protocol = \CMain::IsHTTPS() ? "https://" : "http://";
if (substr($src, 0, 1) == "/")
$strFile = $protocol . $domainUrl . implode("/", array_map("rawurlencode", explode("/", $src)));
elseif (preg_match("/^(http|https):\\/\\/(.*?)\\/(.*)\$/", $src, $match))
$strFile = $protocol . $match[2] . '/' . implode("/", array_map("rawurlencode", explode("/", $match[3])));
else
$strFile = $src;
return $strFile;
}
public static function sortPhotoArray($photos, $type)
{
$sortedPhotos = array();
switch ($type)
{
case 'PRODUCT':
$count = Vk::MAX_PHOTOS_IN_PRODUCT;
// todo: for photos we must ALWAYS set VK-field in first places
break;
case 'ALBUM':
$count = Vk::MAX_PHOTOS_IN_ALBUM;
break;
default:
return $photos;
}
// match sizes of photos. Key of array - sum of width and height
$photosSizes = array();
foreach($photos as $photo)
{
// photo may be not set
if($photo)
{
$sizes = \CFile::GetFileArray($photo);
$photosSizes[$sizes['HEIGHT'] + $sizes['WIDTH']] = array(
'PHOTO_ID' => $photo,
'SIZES_SUM' => $sizes['HEIGHT'] + $sizes['WIDTH']
);
}
}
krsort($photosSizes);
// get elements from sorted sizes until not catch count
while(count($sortedPhotos) < $count)
{
$biggestPhoto = current($photosSizes);
$sortedPhotos[$biggestPhoto['PHOTO_ID']] = $biggestPhoto['PHOTO_ID'];
unset($photosSizes[$biggestPhoto['SIZES_SUM']]);
}
return $sortedPhotos;
}
/**
* Check photo sizes by type of converter
*
* @param $photos - array of photo IDs, ore one photo ID
* @param $type
* @return array - only photos with satisfy of requirements.
*/
public static function checkPhotos($photos, $type)
{
// check empty photos
if(!$photos)
return NULL;
$result = array();
switch ($type)
{
case 'PRODUCT':
$count = Vk::MAX_PHOTOS_IN_PRODUCT;
$needMainPhoto = true;
$sizesLimits = array(
'MIN_WIDTH' => Vk::MIN_PRODUCT_PHOTO_WIDTH,
'MIN_HEIGHT' => Vk::MIN_PRODUCT_PHOTO_HEIGHT,
'MAX_SIZES_SUM' => Vk::MAX_PRODUCT_PHOTO_SIZES_SUM,
'MAX_SIZE' => Vk::MAX_PRODUCT_PHOTO_SIZE,
'RATIO_V' => Vk::MAX_PRODUCT_RATIO_V, // width / height
'RATIO_H' => Vk::MAX_PRODUCT_RATIO_H,
);
break;
case 'ALBUM':
$count = Vk::MAX_PHOTOS_IN_ALBUM;
$needMainPhoto = false;
$sizesLimits = array(
'MIN_WIDTH' => Vk::MIN_ALBUM_PHOTO_WIDTH,
'MIN_HEIGHT' => Vk::MIN_ALBUM_PHOTO_HEIGHT,
'MAX_SIZES_SUM' => Vk::MAX_ALBUM_PHOTO_SIZES_SUM,
'MAX_SIZE' => Vk::MAX_ALBUM_PHOTO_SIZE,
'RATIO_V' => Vk::MAX_ALBUM_RATIO_V, // width / height
'RATIO_H' => Vk::MAX_ALBUM_RATIO_H,
);
// CONVERT photo-id format if needed
if (!is_array($photos))
$photos = array($photos => array("PHOTO_BX_ID" => $photos));
break;
default:
return $photos;
}
// PROCESSED
$i = 1;
foreach ($photos as $photoId => $photo)
{
if ($photoChecked = self::checkPhoto($photoId, $sizesLimits))
{
// MAIN photo is first
if ($i == 1 && $needMainPhoto)
{
$result["PHOTO_MAIN_BX_ID"] = $photoChecked['ID'];
$result["PHOTO_MAIN_URL"] = $photoChecked['URL'];
$count++; //increase limit for other photos
$i++;
}
// other PHOTOS
elseif ($i++ <= $count)
{
$result["PHOTOS"][$photoChecked['ID']]["PHOTO_BX_ID"] = $photoChecked['ID'];
$result["PHOTOS"][$photoChecked['ID']]["PHOTO_URL"] = $photoChecked['URL'];
}
else
{
break;
}
// set flag if image was be resized
if ($photoChecked['RESIZE'])
{
$result["RESIZE"] = true;
$result["RESIZE_TYPE"] = $photoChecked['RESIZE'];
}
}
}
return $result;
}
/**
* Check sizes and filesize of one photo.
* Return only check passed photos
*
* @param $photoId
* @param $sizesLimits
* @return mixed
*/
private function checkPhoto($photoId, $sizesLimits)
{
$photoParams = \CFile::GetFileArray($photoId);
// check bad files
if(!$photoParams)
return false;
$photoSrc = $photoParams["SRC"];
$photoUrl = self::buildPictureUrl($photoParams["SRC"]);
$needResize = false;
$resizeType = BX_RESIZE_IMAGE_PROPORTIONAL; // default not crop
// need 'RESIZE_UP';
if (
$photoParams['HEIGHT'] < $sizesLimits['MIN_HEIGHT'] ||
$photoParams['WIDTH'] < $sizesLimits['MIN_WIDTH']
)
$needResize = 'RESIZE_UP';
// need 'RESIZE_DOWN';
if (
($photoParams['HEIGHT'] + $photoParams['WIDTH']) > $sizesLimits['MAX_SIZES_SUM'] ||
$photoParams['FILE_SIZE'] > $sizesLimits['MAX_SIZE']
)
$needResize = 'RESIZE_DOWN';
// for big RATIO - need a crop. If need resize - use $needResize flag, else - always resize down
if(
(isset($sizesLimits['RATIO_V']) && $photoParams['WIDTH']/$photoParams['HEIGHT'] <= $sizesLimits['RATIO_V']) ||
(isset($sizesLimits['RATIO_H']) && $photoParams['WIDTH']/$photoParams['HEIGHT'] >= $sizesLimits['RATIO_H'])
)
$needResize = $needResize ? $needResize.'_CROP' : 'RESIZE_UP_CROP'; // UP, but we reduce image (need for a get correct sizes)
// calculate new sizes
if ($needResize)
{
switch ($needResize)
{
case 'RESIZE_UP':
$multiplier = max($sizesLimits['MIN_WIDTH'] / $photoParams['WIDTH'], $sizesLimits['MIN_HEIGHT'] / $photoParams['HEIGHT']);
$newWidth = ceil($photoParams['WIDTH'] * $multiplier);
$newHeight = ceil($photoParams['HEIGHT'] * $multiplier);
break;
case 'RESIZE_DOWN':
$ratio = $sizesLimits['MIN_WIDTH'] / $sizesLimits['MIN_HEIGHT'];
$newHeight = floor($sizesLimits['MAX_SIZES_SUM'] / ($ratio + 1));
$newWidth = floor($ratio * $newHeight);
break;
case 'RESIZE_UP_CROP':
if(($sizesLimits['MIN_WIDTH'] / $photoParams['WIDTH']) < ($sizesLimits['MIN_HEIGHT'] / $photoParams['HEIGHT']))
{
$ratio = $sizesLimits["RATIO_H"];
$newHeight = $sizesLimits['MIN_HEIGHT'];
$newWidth = floor($sizesLimits['MIN_HEIGHT'] * $ratio) - 1; // minus one for preserve overratio.
}
else
{
$ratio = $sizesLimits["RATIO_V"];
$newWidth = $sizesLimits['MIN_WIDTH'];
$newHeight = floor($sizesLimits['MIN_WIDTH'] / $ratio) - 1; // minus one for preserve overratio.
}
$resizeType = BX_RESIZE_IMAGE_EXACT; // resize with crop
break;
case 'RESIZE_DOWN_CROP':
if(($sizesLimits['MIN_WIDTH'] / $photoParams['WIDTH']) < ($sizesLimits['MIN_HEIGHT'] / $photoParams['HEIGHT']))
{
$ratio = $sizesLimits["RATIO_H"];
$newHeight = floor($sizesLimits['MAX_SIZES_SUM'] / ($ratio + 1));
$newWidth = floor($ratio * $newHeight) - 1; // need -1, because sizes must be <= ratio
}
else
{
$ratio = $sizesLimits["RATIO_V"];
$newHeight = floor($sizesLimits['MAX_SIZES_SUM'] / ($ratio + 1));
$newWidth = floor($ratio * $newHeight--); // need -1, because sizes must be <= ratio
}
$resizeType = BX_RESIZE_IMAGE_EXACT; // resize with crop
break;
default:
return false;
}
$photoResize = self::ResizeImageGet(
$photoId,
array('width' => $newWidth, 'height' => $newHeight),
$resizeType,
true
// array(array("name" => "sharpen", "precision" => 15))
);
// need save new photo
$paramsToSave = \CFile::MakeFileArray($photoResize['SRC']);
$photoId = \CFile::SaveFile($paramsToSave, "resize_cache/vk_export_resize_img");
$savedFile = \CFile::GetFileArray($photoId);
$photoUrl = self::buildPictureUrl($savedFile['SRC']);
$photoSrc = $savedFile['SRC'];
}
return array(
'RESIZE' => $needResize,
'SRC' => $photoSrc,
'URL' => $photoUrl,
'ID' => $photoId,
);
}
/**
* Overwrite system ResizeImageGet. Need for increase images
*
* @param $file
* @param $arSize
* @param int $resizeType
* @param bool $bInitSizes
* @param bool $arFilters
* @param bool $bImmediate
* @param bool $jpgQuality
* @return bool|mixed
*/
private 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 = \CFile::GetFileArray($file);
}
if (!is_array($file) || !array_key_exists("FILE_NAME", $file) || strlen($file["FILE_NAME"]) <= 0)
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);
// not blocked resize up
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
{
global $arCloudImageSizeCache;
$arCloudImageSizeCache[$file["SRC"]] = array($file["WIDTH"], $file["HEIGHT"]);
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)))
{
/****************************** QUOTA ******************************/
$bDiskQuota = true;
if (\COption::GetOptionInt("main", "disk_space") > 0)
{
$quota = new \CDiskQuota();
$bDiskQuota = $quota->CheckDiskQuota($file);
}
/****************************** QUOTA ******************************/
if ($bDiskQuota)
{
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 && self::ResizeImageFile($sourceImageFile, $cacheImageFileTmp, $arSize, $resizeType, array(), $jpgQuality, $arFilters))
{
$cacheImageFile = substr($cacheImageFileTmp, 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;
}
}
else
{
$cacheImageFile = $imageFile;
}
$cacheImageFileCheck = $cacheImageFile;
}
if ($bInitSizes && !is_array($arImageSize))
{
$arImageSize = \CFile::GetImageSize($_SERVER["DOCUMENT_ROOT"] . $cacheImageFileCheck);
$f = $io->GetFile($_SERVER["DOCUMENT_ROOT"] . $cacheImageFileCheck);
$arImageSize[2] = $f->GetFileSize();
}
$cache[$cache_id] = array(
"SRC" => $cacheImageFileCheck,
"width" => intval($arImageSize[0]),
"height" => intval($arImageSize[1]),
"size" => $arImageSize[2],
);
return $cache[$cache_id];
}
/**
* Overwrite system ResizeImageFile. Need for increase images
*
* @param $sourceFile
* @param $destinationFile
* @param $arSize
* @param int $resizeType
* @param array $arWaterMark
* @param bool $jpgQuality
* @param bool $arFilters
* @return bool
*/
private static function ResizeImageFile($sourceFile, &$destinationFile, $arSize, $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL, $arWaterMark = array(), $jpgQuality = false, $arFilters = false)
{
$io = \CBXVirtualIo::GetInstance();
if (!$io->FileExists($sourceFile))
return false;
$bNeedCreatePicture = 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"]);
$arSourceSize = array("x" => 0, "y" => 0, "width" => 0, "height" => 0);
$arDestinationSize = array("x" => 0, "y" => 0, "width" => 0, "height" => 0);
$arSourceFileSizeTmp = \CFile::GetImageSize($sourceFile);
if (!in_array($arSourceFileSizeTmp[2], array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_BMP)))
return false;
$orientation = 0;
if ($arSourceFileSizeTmp[2] == IMAGETYPE_JPEG)
{
$exifData = \CFile::ExtractImageExif($io->GetPhysicalName($sourceFile));
if ($exifData && isset($exifData['Orientation']))
{
$orientation = $exifData['Orientation'];
//swap width and height
if ($orientation >= 5 && $orientation <= 8)
{
$tmp = $arSourceFileSizeTmp[1];
$arSourceFileSizeTmp[1] = $arSourceFileSizeTmp[0];
$arSourceFileSizeTmp[0] = $tmp;
}
}
}
if (\CFile::isEnabledTrackingResizeImage())
{
header("X-Bitrix-Resize-Image: {$arSize["width"]}_{$arSize["height"]}_{$resizeType}");
}
// imagemagick was be here. I delete them to simplification
if ($io->Copy($sourceFile, $destinationFile))
{
switch ($arSourceFileSizeTmp[2])
{
case IMAGETYPE_GIF:
$sourceImage = imagecreatefromgif($io->GetPhysicalName($sourceFile));
$bHasAlpha = true;
break;
case IMAGETYPE_PNG:
$sourceImage = imagecreatefrompng($io->GetPhysicalName($sourceFile));
$bHasAlpha = true;
break;
case IMAGETYPE_BMP:
$sourceImage = \CFile::ImageCreateFromBMP($io->GetPhysicalName($sourceFile));
$bHasAlpha = false;
break;
default:
$sourceImage = imagecreatefromjpeg($io->GetPhysicalName($sourceFile));
if ($sourceImage === false)
{
ini_set('gd.jpeg_ignore_warning', 1);
$sourceImage = imagecreatefromjpeg($io->GetPhysicalName($sourceFile));
}
if ($orientation > 1)
{
$properlyOriented = \CFile::ImageHandleOrientation($orientation, $sourceImage);
if ($jpgQuality === false)
$jpgQuality = intval(\COption::GetOptionString('main', 'image_resize_quality', '95'));
if ($jpgQuality <= 0 || $jpgQuality > 100)
$jpgQuality = 95;
if ($properlyOriented)
{
imagejpeg($properlyOriented, $io->GetPhysicalName($destinationFile), $jpgQuality);
$sourceImage = $properlyOriented;
}
}
$bHasAlpha = false;
break;
}
$sourceImageWidth = intval(imagesx($sourceImage));
$sourceImageHeight = intval(imagesy($sourceImage));
if ($sourceImageWidth > 0 && $sourceImageHeight > 0)
{
if ($arSize["width"] <= 0 || $arSize["height"] <= 0)
{
$arSize["width"] = $sourceImageWidth;
$arSize["height"] = $sourceImageHeight;
}
self::ScaleImage($sourceImageWidth, $sourceImageHeight, $arSize, $resizeType, $bNeedCreatePicture, $arSourceSize, $arDestinationSize);
if ($bNeedCreatePicture)
{
if (\CFile::IsGD2())
{
$picture = imagecreatetruecolor($arDestinationSize["width"], $arDestinationSize["height"]);
if ($arSourceFileSizeTmp[2] == IMAGETYPE_PNG)
{
$transparentcolor = imagecolorallocatealpha($picture, 0, 0, 0, 127);
imagefilledrectangle($picture, 0, 0, $arDestinationSize["width"], $arDestinationSize["height"], $transparentcolor);
imagealphablending($picture, false);
imagecopyresampled($picture, $sourceImage,
0, 0, $arSourceSize["x"], $arSourceSize["y"],
$arDestinationSize["width"], $arDestinationSize["height"], $arSourceSize["width"], $arSourceSize["height"]);
imagealphablending($picture, true);
}
elseif ($arSourceFileSizeTmp[2] == IMAGETYPE_GIF)
{
imagepalettecopy($picture, $sourceImage);
//Save transparency for GIFs
$transparentcolor = imagecolortransparent($sourceImage);
if ($transparentcolor >= 0 && $transparentcolor < imagecolorstotal($sourceImage))
{
$RGB = imagecolorsforindex($sourceImage, $transparentcolor);
$transparentcolor = imagecolorallocate($picture, $RGB["red"], $RGB["green"], $RGB["blue"]);
imagecolortransparent($picture, $transparentcolor);
imagefilledrectangle($picture, 0, 0, $arDestinationSize["width"], $arDestinationSize["height"], $transparentcolor);
}
imagecopyresampled($picture, $sourceImage,
0, 0, $arSourceSize["x"], $arSourceSize["y"],
$arDestinationSize["width"], $arDestinationSize["height"], $arSourceSize["width"], $arSourceSize["height"]);
}
else
{
imagecopyresampled($picture, $sourceImage,
0, 0, $arSourceSize["x"], $arSourceSize["y"],
$arDestinationSize["width"], $arDestinationSize["height"], $arSourceSize["width"], $arSourceSize["height"]);
}
}
else
{
$picture = imagecreate($arDestinationSize["width"], $arDestinationSize["height"]);
imagecopyresized($picture, $sourceImage,
0, 0, $arSourceSize["x"], $arSourceSize["y"],
$arDestinationSize["width"], $arDestinationSize["height"], $arSourceSize["width"], $arSourceSize["height"]);
}
}
else
{
$picture = $sourceImage;
}
if (is_array($arFilters))
{
foreach ($arFilters as $arFilter)
$bNeedCreatePicture |= \CFile::ApplyImageFilter($picture, $arFilter, $bHasAlpha);
}
if (is_array($arWaterMark))
{
$arWaterMark["name"] = "watermark";
$bNeedCreatePicture |= \CFile::ApplyImageFilter($picture, $arWaterMark, $bHasAlpha);
}
if ($bNeedCreatePicture)
{
if ($io->FileExists($destinationFile))
$io->Delete($destinationFile);
switch ($arSourceFileSizeTmp[2])
{
case IMAGETYPE_GIF:
imagegif($picture, $io->GetPhysicalName($destinationFile));
break;
case IMAGETYPE_PNG:
imagealphablending($picture, false);
imagesavealpha($picture, true);
imagepng($picture, $io->GetPhysicalName($destinationFile));
break;
default:
if ($arSourceFileSizeTmp[2] == IMAGETYPE_BMP)
$destinationFile .= ".jpg";
if ($jpgQuality === false)
$jpgQuality = intval(\COption::GetOptionString('main', 'image_resize_quality', '95'));
if ($jpgQuality <= 0 || $jpgQuality > 100)
$jpgQuality = 95;
imagejpeg($picture, $io->GetPhysicalName($destinationFile), $jpgQuality);
break;
}
imagedestroy($picture);
}
}
return true;
}
return false;
}
/**
* Overwrite system ScaleImage. Need for increase images
*
* @param $sourceImageWidth
* @param $sourceImageHeight
* @param $arSize
* @param $resizeType
* @param $bNeedCreatePicture
* @param $arSourceSize
* @param $arDestinationSize
*/
private static function ScaleImage($sourceImageWidth, $sourceImageHeight, $arSize, $resizeType, &$bNeedCreatePicture, &$arSourceSize, &$arDestinationSize)
{
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"]);
$bNeedCreatePicture = false;
$arSourceSize = array("x" => 0, "y" => 0, "width" => 0, "height" => 0);
$arDestinationSize = array("x" => 0, "y" => 0, "width" => 0, "height" => 0);
if ($sourceImageWidth > 0 && $sourceImageHeight > 0)
{
if ($arSize["width"] > 0 && $arSize["height"] > 0)
{
switch ($resizeType)
{
case BX_RESIZE_IMAGE_EXACT:
$bNeedCreatePicture = true;
$ratio = (($sourceImageWidth / $sourceImageHeight) < ($arSize["width"] / $arSize["height"])) ?
$arSize["width"] / $sourceImageWidth : $arSize["height"] / $sourceImageHeight;
$x = max(0, ceil($sourceImageWidth / 2 - ($arSize["width"] / 2) / $ratio));
$y = max(0, ceil($sourceImageHeight / 2 - ($arSize["height"] / 2) / $ratio));
$arDestinationSize["width"] = $arSize["width"];
$arDestinationSize["height"] = $arSize["height"];
$arSourceSize["x"] = $x;
$arSourceSize["y"] = $y;
$arSourceSize["width"] = ceil($arSize["width"] / $ratio);
$arSourceSize["height"] = ceil($arSize["height"] / $ratio);
break;
default:
if ($resizeType == BX_RESIZE_IMAGE_PROPORTIONAL_ALT)
{
$width = max($sourceImageWidth, $sourceImageHeight);
$height = min($sourceImageWidth, $sourceImageHeight);
}
else
{
$width = $sourceImageWidth;
$height = $sourceImageHeight;
}
$ResizeCoeff["width"] = $arSize["width"] / $width;
$ResizeCoeff["height"] = $arSize["height"] / $height;
$iResizeCoeff = min($ResizeCoeff["width"], $ResizeCoeff["height"]);
// $iResizeCoeff = ((0 < $iResizeCoeff) && ($iResizeCoeff < 1) ? $iResizeCoeff : 1);
$bNeedCreatePicture = ($iResizeCoeff > 0 ? true : false);
$arDestinationSize["width"] = max(1, intval(ceil($iResizeCoeff * $sourceImageWidth)));
$arDestinationSize["height"] = max(1, intval(ceil($iResizeCoeff * $sourceImageHeight)));
$arSourceSize["x"] = 0;
$arSourceSize["y"] = 0;
$arSourceSize["width"] = $sourceImageWidth;
$arSourceSize["height"] = $sourceImageHeight;
break;
}
}
else
{
$arSourceSize = array("x" => 0, "y" => 0, "width" => $sourceImageWidth, "height" => $sourceImageHeight);
$arDestinationSize = array("x" => 0, "y" => 0, "width" => $sourceImageWidth, "height" => $sourceImageHeight);
}
}
}
}