У битрикса нет такого механизма: CFile::ResizeImageFile предлагает либо обрезку до заданных пропорций - либо масштабирование.
Решение: в init.php помещаем следующую функцию:
function image_resize_square($src, $dst){ if(!list($w, $h) = getimagesize($src)) return "Unsupported picture type!"; $type = strtolower(substr(strrchr($src, "." ),1)); if($type == 'jpeg') $type = 'jpg'; switch($type){ case 'bmp': $img = imagecreatefromwbmp($src); break; case 'gif': $img = imagecreatefromgif($src); break; case 'jpg': $img = imagecreatefromjpeg($src); break; case 'png': $img = imagecreatefrompng($src); break; default : return "Unsupported picture type!"; } $x = $y = 0; if($w < $h) { $x = $h/2 - $w/2; $new = imagecreatetruecolor($h, $h); } else { $y = $w/2 - $h/2; $new = imagecreatetruecolor($w, $w); } $color = imagecolorallocate($new, 255, 255, 255); imagefill($new, 0, 0, $color); imagecopyresampled($new, $img, $x, $y, 0, 0, $w, $h, $w, $h); switch($type){ case 'bmp': imagewbmp($new, $dst); break; case 'gif': imagegif($new, $dst); break; case 'jpg': imagejpeg($new, $dst); break; case 'png': imagepng($new, $dst); break; } return true; } |
а в шаблоне компонента такой код:
$proportionArr=Array("width" => 220, "height" => 220); $renderImage=CFile::ResizeImageGet($cId, $proportionArr, BX_RESIZE_IMAGE_PROPORTIONAL, true); if($renderImage['height']!=$renderImage['width'] ){ image_resize_square($_SERVER['DOCUMENT_ROOT'].$renderImage['src'], $_SERVER['DOCUMENT_ROOT'].$renderImage['src'] ); } |
Всё, при первом ресайзе штатными средставми получаем пропорциональную картинку, а дальше, если пропорции не подходят (в нашем случае если картинка не квадратная) - применяем высокотехнологичный костыль из PHP.
Решение взял отсюда, Большое спасибо Вдовину Алексею.