При создании превью картинок заданного (в моём случае квадратного) размера сталкиваемся с проблемой изменения размеров изображения без искажения самого изображения.
Например есть картинка — карандаш. ширина 100 высота 1000
нужно сделать квадратную превью картинку 100х100
если просто уменьшить с сохранением пропорций получаем 10х100
как бы нарастить по бокам для получения квадратной картинки (карандаш должен быть в центре)?
либо наоборот — тот же карандаш но горизонтально расположен
ширина 1000 высота 100
превью картинка так же должна получиться 100х100 — с полями сверху и снизу
Обычный ресайз с сохранением геометрии — сплошь и рядом.
НО до его применения нужно отквадратить искомое изображение!
В случае с карандашем — сделать 1000х1000 а потом уже уменьшить до 100
Собственно, ниже фукнция уквадрачивания 🙂
function image_resize($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;
}
2 комментария на «“Получаем из прямоугольного изображения квадратное”»
Подскажите, а где этот код запускать надо?
То, что нужно! спасибо автору!