Virtuemart imagecopyresized Как изменить размеры миниатюр изображений
- Подробности
- Категория: Virtuemart-2
- Обновлено 22.01.2018
Компонент 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/