В админке правильно надо настроить размеры шерины и высоты
Я специализируюсь на самописных фотогалереях. Текущий алгоритм не позволяет обрезАть фотографии при закачке. Например, превьюшка должна быть горизонтальной по задумке дизайнера, а криворукий клиент закачивает вертикальную фотку. Получается, что фотка уменьшается и накладывается на фон, заданный в админке. Если фон у сайта гладкий без фактуры и градиента, то результат еще более-менее. А вот если дизайнер задумал что-то этакое... Короче, вдруг кому пригодится )) Не претендую на красивость решения, но вроде бы хорошо работает... Итак,
Обрезка изображений (crop):1. В файл cfg/functions.php функцию img_resize полностью заменить на
function img_resize($src, $dest, $width, $height, $rgb = 0xFFFFFF, $quality = 100) {
if (!file_exists($src)) {
return false;
}
$size = getimagesize($src);
if ($size === false) {
return false;
}
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
$icfunc = 'imagecreatefrom'.$format;
if (!function_exists($icfunc)) {
return false;
}
$x_ratio = $width / $size[0];
$y_ratio = $height / $size[1];
if ($height == 0) {
$y_ratio = $x_ratio;
$height = $y_ratio * $size[1];
} elseif ($width == 0) {
$x_ratio = $y_ratio;
$width = $x_ratio * $size[0];
}
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);
$new_width = $use_x_ratio ? $width : ceil($size[0] * $ratio);
$new_height = !$use_x_ratio ? $height : ceil($size[1] * $ratio);
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);
// если нужны картинки с прозрачным фоном, раскомментарить
// if ($format=='png')
// {
// imageAlphaBlending($idest, false);
// imageSaveAlpha($idest, true);
// }
// else
imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
// если нужны картинки с прозрачным фоном, раскомментарить
// if ($format=='png') imagepng($idest, $dest);
// else
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}
function img_crop($src, $dest, $a, $b, $x, $y, $width, $height, $rgb = 0xFFFFFF, $quality = 100) {
if (!file_exists($src)) {
return false;
}
$size = getimagesize($src);
list ($w, $h) = getimagesize($src);
if ($size === false) {
return false;
}
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
$icfunc = 'imagecreatefrom'.$format;
if (!function_exists($icfunc)) {
return false;
}
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);
// если нужны картинки с прозрачным фоном, раскомментарить
// if ($format=='png')
// {
// imageAlphaBlending($idest, false);
// imageSaveAlpha($idest, true);
// }
// else
imagefill($idest, 0, 0, $rgb);
imagecopy($idest, $isrc, $a, $b, $x, $y, $w, $h);
// если нужны картинки с прозрачным фоном, раскомментарить
// if ($format=='png') imagepng($idest, $dest);
// else
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}
// алгоритм ресайза с обрезкой: вырезается центральная часть изображения, если картинка меньше - растянется
function image_resize_crop ($in_url, $out_url, $new_width, $new_height)
{
list ($width, $height) = getimagesize ($in_url);
if ($width / $height > $new_width / $new_height )
{
img_resize($in_url, $out_url, 0, $new_height, CONF_IMAGE_COLOR, 100);
list ($width, $height) = getimagesize ($out_url);
img_crop($out_url, $out_url, 0, 0, ($width - $new_width )/2, 0, $new_width, $new_height, CONF_IMAGE_COLOR, 100);
}
else
{
img_resize($in_url, $out_url, $new_width, 0, CONF_IMAGE_COLOR, 100);
list ($width, $height) = getimagesize ($out_url);
img_crop($out_url, $out_url, 0, 0, 0, ($height - $new_height)/2, $new_width, $new_height, CONF_IMAGE_COLOR, 100);
}
}
// алгоритм ресайза без обрезки: если закачиваемая фотка меньше, она закачается без изменения размеров.
function image_resize_nocrop ($in_url, $out_url, $new_width, $new_height)
{
list ($width, $height) = getimagesize ($in_url);
if ($width >= $new_width)
{
if ($width / $height >= $new_width / $new_height)
img_resize($in_url, $out_url, $new_width, 0, CONF_IMAGE_COLOR, 100);
else
img_resize($in_url, $out_url, 0, $new_height, CONF_IMAGE_COLOR, 100);
}
else
{
if ($height >= $new_height)
img_resize($in_url, $out_url, 0, $new_height, CONF_IMAGE_COLOR, 100);
else
img_resize($in_url, $out_url, 0, $height, CONF_IMAGE_COLOR, 100);
}
}
2. В файле includes/admin/sub/catalog_products_edit.php нужно найти все вызовы функции img_resize и заменить на image_resize_crop или image_resize_nocrop в зависимости от того, где какая функция требуется. Не забыть убрать последний параметр (CONF_IMAGE_COLOR)!
Например, у меня Фотография и Маленькая фотография обрезаются, а Большая фотография только уменьшается до размера по бОльшей стороне (все размеры указываются в админке, кроме размера картинок для корзины, а для карусели используется размер "Маленькая фотография")
P.S. Модераторы, если посчитаете нужным, перенесите тему в раздел Разработка...