Virtuemart imagecopyresized Как изменить размеры миниатюр изображений

Компонент Virtuemart умеет создавать миниатюры изображений товаров, категорий и производителей. Размеры миниатюр задаются в админке, в настройках шаблона. Миниатюры создаются масштабированием исходного файла картинки. То есть, если исходный файл является прямоугольником, то миниатюра не получится квадратом, даже если в админке указаны одинаковые значения для ширины и длины будущей миниатюры. Если по задумке дизайна требуется вывести именно квадратные миниатюры, то и загружать нужно квадратные исходники. Это не совсем удобно. Можно пойти другим путем: обрезать исходное изображение (сделать кроп) по заданным размерам на лету, при загрузке страницы. То есть, заменить resize на crop. Для этого перепишем нужную функцию в ядре Virtuemart.

Изображения миниатюр (тумб) в компоненте Virtuemart-2(3) создаются скриптом img2thumb.php по адресу /administrator/components/com_virtuemart/helpers/

Открываем файл, находим функцию


    private function NewImgResize($orig_img,$newxsize,$newysize,$filename)
    {
    ...
    }

и полностью заменяем код на


{
    //$newxsize; //new width
    //$newysize; //new height
    $orig_size = getimagesize($filename);
    $heightRatio = $orig_size[1]/$newysize;
    $widthRatio = $orig_size[0]/$newxsize;
    if($heightRatio < $widthRatio){
        $optimalRatio = $heightRatio;
    } else {
        $optimalRatio = $widthRatio;
    }
    $optimalHeight = $orig_size[1]/$optimalRatio;
    $optimalWidth = $orig_size[0]/$optimalRatio;
    $imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
    $bgfill = imagecolorallocate( $imageResized, $this->bg_red, $this->bg_green, $this->bg_blue );
    imagealphablending($imageResized, false);
    imagesavealpha($imageResized,true);
    $transparent = imagecolorallocatealpha($imageResized, 255, 255, 255, 127);
    imagecopyresampled($imageResized, $orig_img, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $orig_size[0], $orig_size[1]);
    $cropStartX = ( $optimalWidth / 2) - ( $newxsize /2 );
    $cropStartY = ( $optimalHeight/ 2) - ( $newysize/2 );
    $crop = $imageResized;
    $imageResized = imagecreatetruecolor($newxsize , $newysize);
    $bgfill = imagecolorallocate( $imageResized, $this->bg_red, $this->bg_green, $this->bg_blue );
    imagealphablending($imageResized, false);
    imagesavealpha($imageResized,true);
    $transparent = imagecolorallocatealpha($imageResized, 255, 255, 255, 127);
    imagecopyresampled($imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newxsize, $newysize , $newxsize, $newysize);
    return $imageResized;
}

 Работоспособность проверялась на Virtuemart-2 2.6.12 и Virtuemart-3 2.9.9.4

Решение найдено на сайте www.nulled.cc/threads/254234/