Вход / Регистрация 0
г. Красноярск
Дубровинского 110, оф. 503

Картинка заданной пропорции

Бывает необходимо создать картинку заданных пропорций (например квадратную), а на входе картинки самых немыслимых пропорций.
У битрикса нет такого механизма:  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.

Решение взял отсюда, Большое спасибо Вдовину Алексею.